Transport Layer
TCP 통신
- 연결형 프로토콜
- 신뢰성 보장
- 흐름제어 (수신의 연결이 된 것을 확인후 전송)
- 혼잡제어
- 네트워크 내의 패킷의 수를 조절하여 네트워크 오버플로우를 방지
- 스트림통신 -> 바이트단위로 전송
Go-Back-N
- 누적 Ack
- 싱글(단일)타이머 (윈도우별)
Seletive Repeat
- 개별 Ack
- 개별 타이머 (데이터별)
TCP 세그먼트 구조
설명을 하기위해 세그먼트 0,1,2,3 과 같은 단위로 말했지만 byte 단위이다! (not segments)
TCP Header len : 20byte
Sequence Number : 보낼 데이터의 위치를 보냄
Acknowledgement Number : 받을 데이터의 위치를 보냄
Receive window를 보고 버퍼의 상태 확인 -> 흐름제어
Checksum : 1의 보수
Option 부분에서 MSS 스케일 설정, 연결 설정할 때 확인
만약 Message의 크기가 MSS보다 클 경우 분리하여 전송
TCP 특징
- 누적 Ack <- Go-Back-N의 특징
- 싱글타이머 <- Go-Back-N의 특징 (타임아웃이 걸리면 타임아웃 걸린 패킷만 보냄, GBN과 약간의 차이)
- 버퍼링 <- Selective Repeat의 특징 (지연된, 손실된 데이터를 받을때까지 대기)
- 재전송 (Timeout, 중복Ack인 경우 재전송)
- 타임아웃 시간은 상대적으로 너무 길다
- 중복된 ACK를 이용하여 손실 세그먼트를 알 수 있다.
- 송신자가 3 중복 Ack를 수신하면, Ack를 수신하 ㄴ데이터 이후 세그먼트는 손실되었음을 알 수 있다.
-> fast retransmit : 타임아웃전에 세그먼트를 재전송함.
왜 3개의 중복 Ack를 받고 빠른 재전송을 하는가
-> 2개의 중복 Ack까지는 빈번히 일어날 수 있지만 3개의 중복 Ack는 어느정도 확신에 있는 에러가 있다고 판단이 되기 때문에 타임아웃이 발생하기 전에 세그먼트 재전송을 실행한다.
TCP Flow Control
- 흐름조절
- 수신자는 여유공간을 세그먼트의 RcvWindow에 포함하여 송신자에게 알림
- 송신자는 unAck 데이터를 RcvWindow 값에 한정함
RcvWindow = RcvBuffer - {CastByteRcvd - LastByteRcvd}
- 연결 설정 (3-Way HandShake)
- 클라이언트는 TCP SYN 세그먼트를 서버에 보냄
- 초기 클라이언트 순서번호를 명시
- 데이터 불포함
- 서버는 SYN를 수신하고 SYNACK 세그먼트로 응답
- 서버는 버퍼를 할당
- 서버 초기 순서번호를 규정
- 클라이언트는 SYNACK를 수신하고 ACK로 응답(데이터를 포함할 수 있음)
- 종료 설정 (4-Way HandShake)
- Client는 Server에 TCP FIN 송신
- Server는 FIN을 수신하고 ACK로 응답하고 FIN을 전송하여 연결종료 상태 진입
- Client는 FIN을 수신하고 ACK로 응답
- Server는 ACK를 수신하고 연결 종료