Selective repeat 프로토콜
● 송신자 측 설정
상위 레이어에서 데이터가 수신된 경우
: 패킷의 다음 시퀀스 넘버를 검사하고 윈도우 내에 있으면 패킷을 전송한다.
timeout(n)이 발생한 경우
: n번 패킷을 재전송하고 타이머를 다시 시작한다.
ACK(n)을 수신한 경우
: n이 윈도우에 있다면 패킷이 수신된 것을 확인한다.
: n이 send_base와 같다면 send_base는 가장 작은 시퀀스 넘버를 갖는 미확인 패킷으로 이동한다. 윈도우 내에 이 전송 패킷이 있으면 전송한다.
● 수신자 측 설정
n번 패킷을 수신한 경우
: ACK(n)을 송신한다.
: 기다리던 패킷보다 큰 번호의 패킷이 온 경우 버퍼링한다.
Selective repeat 통신 시나리오는 다음과 같다.
Selective repeat 응답 패킷 소실 시 통신 시나리오는 다음과 같다.
TCP 프로토콜
point‐to‐point
: 단일 송/수신자간의 통신이다.
신뢰적인in‐order(순서에 맞는) 바이트 스트림
: 메세지에 구분이 없다.
pipelined
: RTT내에 윈도우사이즈만큼 패킷을 보내는 방식이다.
: 혼잡 제어나 흐름 제어를 통해 윈도우 사이즈를 제어한다.
buffer
: 송/수신 측은 버퍼링을 갖는다.
송신 측이 버퍼링하는 패킷은 윈도우 안의 응답안 된 패킷, 수신 측이 버퍼링하는건 기다리던 패킷보다 시퀀스 넘버가 큰 패킷이다.
full duplex
: 동일 커넥션에 양단이 동시에 데이터를 전송할 수 있다.
connection oriented
: handshake를 먼저 수행한다.
: 통신 시작 요청을 보내는 것은 클라이언트이다.
Flow control
: 송신자가 리시버를 압박하지 못하도록 리시버가 전송량을 통제한다. 즉, 윈도우사이즈 상한선을 정한다.
● TCP seq#와 ACK
seq#
- 바이트 스트림 넘버를 사용한다. 세그먼트의 첫 번째 바이트가 내가 보내는 총 데이터에서 몇 번째인지를 표시한다.
ex) hello -> h가 seq1이다.
ACKs
- 다음에 받을 첫번째 바이트의 순서번호이다.
- 누적 ACK가 가능하다.
[그림]
● TCP의 RTT / Timeout
RTT와 Timeout를 설정하는 계산보다 컨셉의 이해가 중요하다.
타임아웃을 설정할 때 기본적으로 RTT보다 커야한다.
- 너무 작은 경우: 불필요한 재전송이 일어난다.
- 너무 큰 경우 : 세그먼트 손실에 대한 대응이 늦어진다.
RTT는 네트워크 상태에 따라 값의 변동이 크다.
- 네트워크가 불안정한 경우: 타임아웃 시간과 Estimated RTT(RTT 추정치)의 차이가 커야한다.
- 네트워크가 안정적인 경우: 타임아웃 시간과 Estimated RTT(RTT 추정치)의 차이가 작아도 된다.
TCP의 신뢰적인 데이터 전송
TCP는 Pipelined 프로토콜이다.
누적 ACK를 사용한다.
단일 재전송 타이머를 사용한다.
재전송을 일으키는 이벤트
- 타임아웃
- 중복 ACK
● TCP의 송신자 이벤트
App로부터 데이터를 수신한 경우
: seq#를 가진 세그먼트를 생성한다.
: seq#는 첫 번째 바이트의 바이트 스트림 번호이다.
: 타이머를 시작한다. (다른 세그먼트에 의해서 타이머가 실행 중이 아닐 때)
timeout
: 타임아웃을 일으킨 세그먼트를 재전송한다. 이때 send_base의 세그먼트만 재전송한다.
: 타이머를 재시작한다.
ACK가 확인 안된 세그먼트의 ACK인 경우
: ACK의 seq#가 send_base보다 크면 이전에 확인 응답이 안된 세그먼트에 대해 확인하고 send_base를 갱신한다.
: 아직 확인 응답이 안된 세그먼트가 존재하면 타이머를 재시작한다.
TCP 통신 시나리오는 다음과 같다.
TCP 응답 패킷 소실 시 통신 시나리오는 다음과 같다.
리눅스 - 생성된 디스크 사용 과정
생성된 디스크는 fdisk -> mkfs -> mount 의 과정을 거쳐 비로소 사용할 수 있게 된다.
● fdisk
fdisk는 파티션을 만드는 단계이다.
# fdisk 디스크명
ex) # fdisk /dev/sda
- fdisk 프롬프트에서 사용하는 명령어
p : 현재 파티션 상태를 출력한다.
d : 파티션을 삭제한다.
n : 파티션을 생성한다.
t : 파티션을 변경한다.
w : 저장 후 종료한다.
q : 취소 후 종료한다.
● mkfs
mkfs는 파일 시스템을 만드는 단계이다. 윈도우에서는 포맷한다는 표현을 사용한다.
# mkfs-t [파일시스템타입] 파티션명
ex) # mkfs.xfs ‐f /dev/sdb1
● mount
mount는 특정 파티션 디바이스를 특정 디렉토리에 연결하는 단계이다.
# mount [‐a] [‐t [FStype]] [파티션명] [디렉토리]
ex) # mount ‐t xfs /dev/sdb1 /home/data1
+
- o 옵션 : 마운트 옵션을 추가로 지정한다.
noatime : atime을 갱신하지 않는다.
remount : 옵션 변경을 위해 재마운트한다.
ro : Read Only로 정의한다.
- t 옵션 : 파일 시스템 양식을 정한다.
- a 옵션 : /etc/fstab의 내용을 읽어 모두 마운트한다.
- B 옵션: 바인드 마운트로, 디렉토리를 디렉토리로 마운트한다. (01.21 수정)
- umount
umount는 mount된 파일 시스템을 시스템으로부터 제거한다.
# umount [디렉토리명] 또는[장치명]
ex) # umount /home/data1
이미 파일이 들어있는 디렉토리에 파티션을 마운트해버리면 기존의 파일은 은닉되어 접근할 수 없다.
● blkid
blkid는 파티션의 정보를 확인하는 명령어이다.
# blkid
# blkid 를 실행하면 위와 같이 파티션의 UUID를 확인할 수 있다. UUID는 파티션의 고유 정보로 하드웨어가 생성될 때 생긴 ID이므로 디스크의 위치가 바뀌어도 동일하게 유지된다.
● findfs
UUID나 라벨명으로 장치명을 확인한다.
# findfs LABEL=[라벨명]
# findfsUUID=[uuid]
'일일 정리' 카테고리의 다른 글
혼잡제어의 원리, TCP 혼잡제어, Cisco 설치, 리눅스 - 네트워크 설정, 다양한 네트워크 명령어(ping, netstat, arp, traceroute(tracert), route) (0) | 2025.01.22 |
---|---|
TCP의 신뢰적인 데이터 전송, 리눅스 - 자동 마운트 (2) | 2025.01.21 |
HTML/PHP 변수/데이터 타입, 연산자 (0) | 2025.01.19 |
Go-Back-N 프로토콜, 파일 시스템과 파티션 (0) | 2025.01.16 |
rdt 2.2 (NAT가 없는 rdt), rdt 3.0 (패킷 소실), 파이프라인 프로토콜, 퍼미션, 파일의 속성 (0) | 2025.01.15 |