728x90
이번 포스트에서는 TCP에 대해 다루겠다.
TCP의 특징 :
- Point-to-point (점대점): 데이터의 시작점과 끝점 사이의 연결을 관리한다.
- Reliable, in-order byte stream: 신뢰성 보장, 순서대로 온 것만 애플리케이션 레이어로 올려준다.
- Full duplex data: 양방향 통신, 최대로 보낼 수 있는 세그먼트가 사이즈(MSS)가 정해져 있다.
- Cumulative ACKs: ACK(10) - 9번까지 잘 받았으니 이제 10번 보내달라는 뜻이다. 페이로드 없고 헤드(20바이트) 부분만 존재한다.
- Pipelining: 파이프라이닝 방식 사용한다.
- Connection-oriented (연결 지향): 3-way handshaking으로 연결하고 4-way handshaking으로 연결 종료한다.
- Flow control: 흐름 제어
- Congestion control: 혼잡 제어
TCP 세그먼트 구조 :
- source port: 발신지 포트
- dest port: 목적지 포트
- sequence number: 세그먼트의 일련번호를 저장하는 공간
- acknowledgement number: ACK의 일련번호를 저장하는 공간
- ACK: 지금 보내는 세그먼트가 ACK 세그먼트인지 아닌지를 구별한다.
- checksum: 비트 에러 체크
- receive window: 흐름 제어
TCP Sequence Numbers :
- 10바이트의 메시지가 있고 3개의 세그먼트로 쪼개서 보낸다고 가정할 때, 각 세그먼트의 시퀀스 넘버는 다음과 같다.
- 첫 번째 세그먼트: 맨 앞에 있는 Byte number인 0
- 두 번째 세그먼트: 맨 앞에 있는 Byte number인 4
- 세 번째 세그먼트: 맨 앞에 있는 Byte number인 8
- 단, 실제로 Byte number같은 경우에는 랜덤으로 구성되어 있으며 서로간의 관계만 나타낼 수 있으면 된다.
TCP Retransmission 시나리오 :
- Seq 92와 Seq 100을 전송한다.
- ACK 100이 중간에 loss 됐다.
- ACK 120이 타임아웃 되기 전에 잘 도착했다.
- Seq 120부터 전송한다.
TCP Fast Retransmit :
- Seq 92와 Seq 100을 전송한다.
- Seq 100이 중간에 loss 됐다.
- Receiver 쪽에는 계속 100번을 달라고 요청한다.
- 똑같은 ACK이 3번 도착하면(triple duplicate) 타임아웃 끝내기 전에 재전송한다. (맨 위에 있는 ACK 100은 duplicate가 아님)
3-way handshaking(연결) :
- 클라이언트가 헤더(20바이트)만 존재하는 세그먼트를 보낸다(시퀀스 넘버 포함).
- 서버는 시퀀스 넘버인 X부터 시작한다는 것을 알고 그에 대한 응답을 한다. 이때 ACK 번호는 x(클라이언트 시퀀스 넘버)+1(SYNbit 크기)이다.
- 클라이언트 측이 서버가 보낸 SYN 메시지를 잘 받았으면 이에 대한 ACK 메시지(y+1)를 전송하여 연결을 시작한다.(이때 바로 메시지를 전송해도 된다.)
(3-way handshaking 이후 sender는 receiver한테 첫 번째 세그먼트의 시퀀스 넘버를 알려줘야 한다.)
4-way handshaking (종료) :
- 클라이언트 측이 종료를 뜻하는 FINbit를 보낸다.
- 서버 측은 이를 수락하여 ACKbit를 보낸다.
- 서버가 더 보낼 데이터가 남아 있거나, 전송 중인데 도착하지 않는 데이터가 존재할 수 있으므로 잠깐의 딜레이 후에 연결을 끊는다.
- 잠깐의 딜레이 후에 서버가 다시 클라이언트 측으로 FINbit를 보낸다.
- 클라이언트 측은 이를 수락하여 ACKbit를 보낸다.
- ACKbit도 loss될 수 있으므로 잠깐의 타임아웃 후에 연결을 완전 종료한다.
'Networking' 카테고리의 다른 글
혼잡 제어 (TCP) (0) | 2022.06.15 |
---|---|
연결 관리 및 흐름 제어 (TCP) (0) | 2022.06.14 |
Go-Back-N & Selective Repeat (0) | 2022.06.04 |
Reliable Data Transfer (RDT) (0) | 2022.05.26 |
Transport Layer (전송 계층) (0) | 2022.05.06 |