02-1. Transmission Control Protocol (TCP)

다나·2022년 12월 20일
0

컴퓨터 네트워크

목록 보기
2/6
post-thumbnail

TCP는 내용이 많아서 글을 2개로 나누어서 작성하였습니다 🙋🏻‍♀️
그리고 그림과 사진은 모두 책을 보고 똑같이 직접 그린 그림입니다~! 😎

1. Boundary & Stream Delivery 📨

UDP : Boundary Delivery
즉, Application에서 본 Boundary가 message 전달 시 유지된다.

TCP : Stream Delivery
즉, Application에서 본 Boundary가 message 전달 시 사라진다.
나열하고 필요한 만큼 (Byte 단위로) 끊어서 전달한다. (stream of bytes)

2. Sending and Receiving Buffers 🗄️

TCP의 Sending Buffers
1) Sent : 상대방이 못 받을 경우를 대비하여, 보낸 packet의 copy를 저장하는 공간
2) Not Sent : 아직 상대방에게 보내지 않은 것을 저장하는 공간
3) Empty : Sending process(application)에서 보내주면 저장할 빈공간

TCP의 Receiving Buffers
1) Not Read : 상대방이 보낸 것 중에서 Receiving process(application)이 아직 읽지 않은 것을 저장하는 공간

  • 중간에 못 받은 packet이 있는 경우, 해당 packet 전까지만 receiving process로 이동한다.

2) Empty : 상대방이 보내는 것들을 저장할 빈공간

3. Sequence Number 🔢

  • TCP에 의해 Packet마다 번호가 지정된다.
    그리고, 0번부터 번호가 지정되는 것이 아니라 랜덤한 번호로 생성된 숫자부터 시작한다.
  • 하나의 segment의 sequence 번호 = 해당 segment의 첫번째 data byte

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

4. ACK 전달 방식 📈

1) Selective ACK : 받은 번호를 알려준다.

  • 신뢰성 보장하고, 직관적이다.

2) Cumulative ACK : 다음에 받고 싶은 번호를 알려준다.

  • TCP 방식이다.
    ex) ACK #201인 경우, 101~200까지 받았고, 201을 받고 싶다는 것을 의미한다.

5. TCP segment format 📍

TCP segment는 Header(20~60bytes) + Data로 이루어져 있다.

TCP Header의 구성요소

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의 길이

  • HLEN = 실제 Headerd의 길이 / 4
  • Header의 길이는 20~60bytes이고, options 여부에 따라서 최대 길이는 60byte까지 될 수 있다. 따라서 Header와 data를 구분하기 위해서, Header의 길이를 기록해 놓아야 한다.
  • 4bits로는 최대 15까지만 표현이 가능하지만, Header의 최대 길이는 60이므로 60/4 = 15로 기록해놓는다. (원래 6bits가 필요하지만, 2bits를 아끼기 위해서 4로 나눈다)

6) Reserved (6bits) : 현재 사용하지 않는 예비용
7) Control field (6bits)

  • URG, ACK, PSH, RST, SYN, FIN으로 구성되어 있고, 해당 되는 field일 경우 1로 표시되어 있다.

8) Window Size (16bits) : 상대방이 받을 수 있을 만큼의 사이즈
9) Checksum (16bits) : 데이터 전송 중에 오류 발생을 확인하는 용도

  • TCP에서의 Checksum 사용은 mandatory(필수)이다.
  • 그러나, UDP에서의 Checksum 사용여부는 선택이다.

10) Urgent pointer (16bits)
11) Options and Padding (0~40bytes)

6. TCP 연결 Establishment 👋

Three-way handshake 방식

  • SYN segment : data를 가지고 가지 않는다. 1개의 sequence number만 사용한다.
  • SYN + ACK segment : data를 가지고 가지 않는다. 1개의 sequence number만 사용한다.
  • ACK segment : data를 가지고 가지 않는다. sequence number를 사용하지 않는다. (Ack에 대한 Ack은 없다!)

7. TCP connection termination 👏

1) Three-way handsake 방식

  • FIN segment : data를 가지고 있지 않다면, 1개의 sequence number를 사용한다.
  • FIN + ACK segment : data를 가지고 있지 않다면, 1개의 sequence number를 사용한다.

2) Four-way handsake 방식

  • three-way handshake 방식과 유사하지만, ACK segment와 FIN segment가 따로 전송된다.

8. Time-wait가 있는 이유 ⏰

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 상태로 둔다.

9. Window Size 🪟

  • 상대방이 받을 수 있을 만큼의 사이즈를 의미한다.
  • 즉, 상대방의 Buffer에 빈 공간이 생기는 속도 = Server Application이 가져가는 속도 = Clien의 전송 속도이다.
  • 따라서, Flow controlSender가 데이터를 보내는 속도 상대방이 받을 수 있는 공간이 생기는 속도(상대방 application에서 데이터를 가져가는 속도)로 결정된다는 것을 의미한다.
  • Receive Window Size = rwnd : Receiver의 빈공간 정보를 Ack와 함께 같이 보낸다.
profile
컴퓨터공학과 학생이며, 백엔드 개발자입니다🐰

0개의 댓글