TCP, UDP 두 가지 방식
UDP: Connectionless transport / TCP: Connection-oriented transport
transport layer에서 multiplexing을 통해 만들어진 데이터
Segment = Header + Data
Demultiplexing시 포트 번호를 통해 전달해야 할 소켓 결정
일반적으로 헤더 크기 <<< 데이터 크기
UDP는 신뢰성이 낮은 프로토콜로 TCP보다 단순
UDP보다 높은 신뢰성 보장
TCP에서는 RDT 보장, UDP에서는 보장하지 않음
RDT는 신뢰성이 보장되지만 데이터를 하나씩 주고 받기 때문에 효율이 좋지 않음
Pipeline을 이용하면 여러 데이터를 한꺼번에 주고 받을 수 있음
문제점: 정상 전송된 패킷이 버려지고 재전송되어 비효율적
Go-Back-N의 비효율 개선
receiver가 buffer 역할을 해 들어오는 데이터 순서가 맞지 않더라도 모두 저장해 놓고 있음 → 현재 window에 해당하는 데이터를 모두 받을 때까지 기다림
dilemma: Seqence #(시퀀스 번호)가 무한하지 않음
window size가 N이면 시퀀스 번호는 N*2 정도 필요
reliable data transfer - pipeline 방식 사용
feedback을 통해 loss를 파악하고 재전송
sender가 receiver의 용량을 고려해서 segment를 전달하는 방식
receiver window(RWND): receiver buffer에 남아있는 빈 공간
RWND를 헤더에 담아서 알려줌 - 오버플로우 발생 x
receiver buffer에 자리가 없으면 sender는 계속해서 작은 데이터를 보내고 feedback을 받으면서 자리가 생기는지 확인
2-way handshake - 보내는 쪽은 데이터가 잘 전송되었는지 확인이 가능하지만 받는 쪽은 확인할 수 없음
TCP SYN - SYNbit = 1
SYN/ACK - 헤더의 SYNbit, ACKbit = 1
ACK - ACKbit = 1
연결 종료 - FINbit = 1
timed wait
클라이언트에서 ack을 보내고 close 했지만 loss가 발생하면 server에서 ack을 받지 못해 계속 기다리게 되기 때문에 약간의 시간을 두고 buffer close
TCP에서 segment loss가 일어날 경우 데이터 재전송
congestion control 과정은 3 main phases로 구성됨
MSS(Maximum Segment Size)
window size(buffer)를 1MSS부터 시작해서 증가/감소
네트워크를 먼저 사용하고 있던 사람이 처음에는 더 높은 속도를 가질 수 있음
후발주자가 들어오면서 loss가 발생하면 Multiplicative decrease를 통해 모두가 속도를 절반으로 감소시킴 → 계속 반복하며 공평해짐
TCP 각각에게는 공평하지만 사용자 단위로 TCP Connection을 많이 가지고 있는 사용자에게 유리함