TCP는 내용이 많아서 글을 2개로 나누어서 작성하였습니다 🙋🏻♀️
그리고 그림과 사진은 모두 책을 보고 똑같이 직접 그린 그림입니다~! 😎
UDP : Boundary Delivery
즉, Application에서 본 Boundary가 message 전달 시 유지된다.
TCP : Stream Delivery
즉, Application에서 본 Boundary가 message 전달 시 사라진다.
나열하고 필요한 만큼 (Byte 단위로) 끊어서 전달한다. (stream of bytes)
TCP의 Sending Buffers
1) Sent : 상대방이 못 받을 경우를 대비하여, 보낸 packet의 copy를 저장하는 공간
2) Not Sent : 아직 상대방에게 보내지 않은 것을 저장하는 공간
3) Empty : Sending process(application)에서 보내주면 저장할 빈공간
TCP의 Receiving Buffers
1) Not Read : 상대방이 보낸 것 중에서 Receiving process(application)이 아직 읽지 않은 것을 저장하는 공간
2) Empty : 상대방이 보내는 것들을 저장할 빈공간
ex) TCP connection이 5,000 bytes의 파일을 전송하는 경우
첫번째 byte를 10,001 (랜덤한 번호)이라고 할 때, data가 5개의 segments로 전송된다면 각각의 segment의 크기는 1,000 byte이다.
Segment 1 : Sequence Number = 10,001, Range = 10,0001 ~ 11,000
Segment 2 : Sequence Number = 11,001, Range = 11,001 ~ 12,000
Segment 3 : Sequence Number = 12,001, Range = 12,001 ~ 13,000
Segment 4 : Sequence Number = 13,001, Range = 13,001 ~ 14,000
Segment 5 : Sequence Number = 14,001, Range = 14,001 ~ 15,000
1) Selective ACK : 받은 번호를 알려준다.
2) Cumulative ACK : 다음에 받고 싶은 번호를 알려준다.
TCP segment는 Header(20~60bytes) + Data로 이루어져 있다.
1) Source Port Address (16bits) : 보내는 쪽의 Port 번호
2) Destination Prot Address (16bits) : 받는 쪽의 Port 번호
3) Sequence Number (32bits) : packet의 일련 번호 = 첫번째 data byte
4) Acknowledgment number (32bits) : ACK 번호 = 다음에 받고 싶은 번호
5) HLEN (4bits) : Headerd의 길이
6) Reserved (6bits) : 현재 사용하지 않는 예비용
7) Control field (6bits)
8) Window Size (16bits) : 상대방이 받을 수 있을 만큼의 사이즈
9) Checksum (16bits) : 데이터 전송 중에 오류 발생을 확인하는 용도
10) Urgent pointer (16bits)
11) Options and Padding (0~40bytes)
1) client가 마지막에 보낸 ACK이 없어지는 것을 대비하기 위해서
TCP는 일정 시간이 지나도 ACK이 오지 않으면, sever가 다시 FIN을 보낸다.
그러나 client가 기다리지 않고 연결을 끊는다면, FIN을 처리해줄 client가 존재하지 않는다.
따라서 이를 방지하기 위해서, client는 Time wait 시간 동안 기다린 다음에 연결을 종료한다.
2) 기존의 connection의 데이터와 새로운 connection의 데이터를 구별하기 위해서
기존 connection과 똑같은 IP와 Port를 사용하는 connection이 새롭게 생성된다면, 기존의 connection의 데이터와 새로운 connection의 데이터를 구별할 수 없다.
따라서, 기존의 connection port 번호는 살려두고, 새로운 connection에서의 port 번호를 다르게 부여하여 구별하기 위해서 Time-wait 상태로 둔다.