TCP(Transmission Control Protocol) 전송 제어 프로토콜


연결 지향형이며, 신뢰성이 있는 데이터를 보낼때 사용하는 전송 계층 프로토콜이다.

전송계층

수신 버퍼 / 송신 버퍼가 존재한다. 포트로 교환 일대다 교환 가능

TCP 헤더

tcp header

필드 내용 크기(bits)
Source Port 송신지 포트 번호 16
Destination Port 목적지 포트 번호 16
Sequnece Number 순서번호, 가지고 있는 데이터의 첫번째 바이트에 할당된 번호 32
Acknowledgement Number 확인응답 번호, 해당 세그먼트 송신자가 받기를 기대하는 Sequnece Number(바이트 번호) 32
Data Offset(Header Length) 헤더 길이, 해당 값에 4를 곱한 값이 TCP Header 길이이며 필드 값은 5 ~ 15 들어가기 때문에 TCP Header 길이는 20bytes ~ 60bytes 라 할수있다. 4
Reserved 미래를 위해 예약된 필드, 모두 0으로 채워져야 한다. 6
Control(URG ~ FIN) TCP 통신 제어에 사용되는 6개의 서로 다른 제어 비트 또는 플래그를 나타낸다. 동시에 여러 개의 비트가 1로 설정될 수 있다.
  • URG: 긴급합을 알리는 플래그(Urgent pointer에 값이 채워져 있음을 의미)
  • ACK: 확인을 나타내는 플래그(Acknowledgement에 값이 채워져 있음을 의미)
  • PSH: 수신버퍼를 모두 채우지 앓고 바로 발송하라는 플래그
  • RST: 강제 연결 초기화 플래그
  • SYN: 연결시작 요청 플래그
  • FIN: 연결해제 요청 플래그
6
Window Size 수신자가 반드시 유지해야 한다는 바이트 단위의 윈도 크기, 0이면 송신 프로세스 전송 중지 16
Checksum 데이터 검사합(데이터에 대한 오류 검출 용도) 16
Urgent pointer 긴급데이터가 포함되어 있는 경우 시작부분에 삽입되는데 이에 긴급데이터의 종료 지점 값을 나타낸다. 16
Options TCP 옵션 데이터 0 ~ 40

세그먼트

TCP는 보낼 데이터중 다수의 바이트를 묶어 그룹화 한후 헤더를 붙여 하나의 패킷으로 전송을 하는데 이를 세그먼트라고 한다.(단, 동일한 크기를 가지진 않는다.)

그림

번호부여 시스템

TCP는 신뢰성이 있는 통신을 위해 헤더에 포함되어 있는 순서번호와 확인응답 번호를 사용한다.

순서번호(Sequence Number)

TCP는 연결 상태에서 전송되는 모든 데이터 바이트에 번호를 부여하는데 프로세스에서 데이터를 수신하여 송신 버퍼에 저장되는 시점에 부여된다. 이때 세그먼트에 포함된 첫번째 데이터 바이트 번호값이 바로 순서번호가 된다.
제어 정보만 포함된 세그먼트 경우에도 1바이트가 들어 있기 때문에 순서번호가 존재한다.

초기 번호는 0부터 시작되지 않고 0 ~ 2^32 - 1 사이의 임의의 번호로 시작되는데 만들어지는 초기 순서번호를 ISN이라 한다.

확인응답 번호(Acknowledgement Number)

확인응답 번호는 모든 데이터를 받았음과 동시에 다음에 수신 받아야할 순서번호를 의미한다. 수신한 데이터의 마지막 바이트 번호에서 + 1 값을 확인응답 번호로 지정하므로 (확인응답 번호) = (수신한 순서 번호) + (수신된 데이터 크기) 라고 감히 생각해 볼 수 도 있다. 이를 통해 데이터가 중간에 유실된 경우 정확한 확인응답 번호가 되지 못한다는 것도 알 수가 있다.

link https://velog.io/@hidaehyunlee/TCP-%EC%99%80-UDP-%EC%9D%98-%EC%B0%A8%EC%9D%B4

스트림 전송 방식

연결형 서비스

신뢰성 데이터

udp와 달리 데이터 크기 값이 없어

예를들어 TCP가 단지 1바이트의 데이터를 포함하는 세그먼트를 전송하는 경우,

단지 1바이트의 사용자 데이터를 전달하기 위하여 41바이트의 데이터그램이 전송되어야함(20바이트의 TCP헤더와 20방트의 IP헤더). 즉 오버헤드는 41/1이 되고, 네트워크의 용량은 상당히 비효율적.

이러한 문제를 실리윈도우신드로라고함.