TCP 3. Flow Control
TCP layer는 data만 추출하여
TCP socket receiver buffer에 저장
application process는 그 buffer 에서 데이터를 읽음
flow control은 sender가 너무 많이 보내서
이 buffer에 넘치도록 하는 것을 방지하는 것
receive buffer size는 OS가 지정
- 보통 4096을 할당
- 대부분의 OS는 RcvBuffer를 auto-adjust할 수도 있음
rwnd : receive window in TCP header
- free buffer space
- sender는 unacked된,
- 즉 inflight data의 양이 receiver의 rwnd 값을 넘지 않도록 조절
계산식 : RcvBuffer - buffered data = free buffer space
TCP의 rwnd는 sending side에서 유지하는 parameter인데,
이것은 receiver가 보내는
segment header의 receive window field에 의해 결정된다.
즉, sender는 ack.된 sequence 번호로부터
receive window field에 표시된 byte 만큼을
ack. 받지 않은 상태로 더 보낼 수 있다.
link가 더 느리기에 A의 TCP socket은 100Mbps에 맞추어 전송.
B의 reciever buffer에서 50Mbps 이후로 buffer가 넘치기에
host B는 host A에게 RcvWindow=0를 통해 그만 보내라고 알림.
RcvWindow>0이 될 때까지 host A는 TCP segment를 보내지 않음
이렇게 host A가 stop and start 를 반복하며 flow control.
TCP 4. Connection Management
handshake 시기에 connection 설립 동의를 둘 다 확인할 수 있어야 함
connection parameter를 설정 : initial sequence number, rcvBuffer size
clientSocket() 생성 하여 welcomeSocket에 요청이 들어오면
connectionSocket() 생성
2-way handshake : 사람만 가능
client server에서는 loss로 인한 retransmission이나 delay 등으로 실패하기 쉬움
TCP 3-way handshake
SYN bit로 처음에는 initial sequence number를 보냄
syn에 대해 synack으로 답함 : syn, ack 모두 세팅됨
ACKnum = sequence num+1
그 크기는 ACKbit 에
TCP 3-way handshake : FSM Final state machine
<client>
clientsocket을 생성하면 syn 생성
synack과 ack을 생성 - 여기에 실제 보내려는 data를 받음
<server>
listen은 상대방으로부터 syn 받을 때까지
거기에 대한 synack을보낸 뒤 SYN rcvd 상태로 넘어감
거기서는 이에 대한 ack을 기다림
TCP : closing connection
클라이언트 서버 각각 자신의 커넥션을 닫아야 함
( TCP는 양방향이라서)
FINAL FIN bit = 1로하여 TCP segment를 전송
너에게 보낼 데이터가 더 없다고 알림 ( close waiting state)
이에 대한 응답은 ACK을 하면서 동시에 할 수 있음
동시에 FIN을 교환하는 것도 가능 (simultaneous)
LAST_ACK을 받은 뒤로
max segment lifetime의 2배만큼 기다림
LAST_ACK에 대한 ACK이 loss일 때
LAST_ACK을 다시 보낸 것을 받을 수 있도록
max segment lifetime의 2배까지면 충분히 기다린 것으로 생각
그 이상은 ghost packet이 너무 많이 떠다니게 됨
'CS > Network' 카테고리의 다른 글
3-6 TCP detecting loss & Fairness & ECN (0) | 2021.12.03 |
---|---|
3-5 TCP Congestion Control (0) | 2021.12.03 |
Reliable data transfer - TCP (0) | 2021.10.16 |
Connectionless Transport : UDP (checksum) (0) | 2021.10.16 |
Transport Layer - MUX, DeMUX (0) | 2021.10.16 |