컴퓨터/Network

[Network] TCP와 TCP 세그먼트의 구조

도도새 도 2023. 11. 2. 18:57

TCP에 대하여

 

TCP는?

  • TCP는 하나의 프로세스와 하나의 프로세스 간의 통신을 담당한다.(point to point)
  • 신뢰성있고 순서가 있는 방식이다. 즉 데이터가 손실되지 않도록 보장하고 전송되는 데이터는 수신 측에서도 유지된다.(reliable, in-order byte)
  • 한 번에 여러 데이터를 보내게 된다. 데이터 스트림이 세그먼트로 분할되어 전송된다.(pipelined)
  • 두 개의 각 네트워크는 sender와 receiver역할을 모두 하게 된다.(full duplex data)
  • sender는 receiver가 소화 가능한만큼한 세그먼트를 전송한다
  • 내부 네트워크(프로세스 사이)가 받아들일 수 있는 만큼만 세그먼트를 전송한다(congetion control)

 

TCP 세그먼트 구조

 

TCP는 데이터 스트림으로부터 데이터를 받아들인 후 이를 일정 단위로 분할하여 TCP를 헤더를 붙여 TCP 세그먼트를 생성하게 된다. 세그먼트는 TCP의 기본 전송 단위이다. 이는 OSI 7계층 중 전송 계층에서 일어나는 일이다.

어플리케이션 레이어의 경우 기본 전송 단위가 message이다. 이 메시지가 전송 계층(TCP)에 내려오게 되면 세그먼트의 data에 들어가게 된다.

(이렇게 생성된 세그먼트는 네트워크 계층에서 다른 프로세스로 운반되게 된다. 즉 전송 계층에서 하는 일은 어플리케이션 계층에서 메시지를 받은 후, 해당 메시지를 세그먼트 형태로 동봉하는 것이다.)

 

즉 TCP 세그먼트는 TCP헤더 + 데이터의 형태를 가진다.

 

 

TCP 세그먼트 형태

  1. Source port(16bit): 송신 측의 포트 번호를 나타낸다
  2. Destination port(16bit): 수신 측의 포트 번호를 나타낸다.
  3. Sequence number(32bit): TCP 세그먼트 내의 데이터 송신 바이트 흐름의 위치를 가리킨다.
  4. Acknowledgment number(32bit): 수신자가 예상하는 다음 시퀀스 번호이다. 한쪽이 보낸 세그먼트에 대한 응답이다.

Flags

  1. Receive window: 흐름 제어에 사용되며, 수신자가 받아들일 수 있는 바이트 수를 나타낸다.
  2. URG: Urgent pointer 필드의 값이 유효함을 나타낸다.
  3. ACK: 확인 필드가 유효하다는 것을 나타낸다.(예를 들어 수신자가 Seq1과 Seq2를 받으면 발신자에게 ACK3을 날리게 된다. 이는 Seq2까지 정상 수신하였고 Seq3을 보내달라는 의미, 즉 수신자가 예상하는 다음 시퀀스 번호이다.)
  4. PSH: 수신자는 데이터를 즉시 상위 계층 프로토콜로 전달해야 함을 나타낸다.(강제 전송)
  5. RST: TCP 연결이 재설정 되어야 한다는 것을 나타낸다.
  6. SYN: 초기 핸드셰이크 중에 사용되며 연결을 설정할 때 사용된다.
  7. FIN: 연결 종료 중에 사용되며 연결을 정리할 때 사용된다.(TCP 연결 종료)

 

간략한 시나리오

 

간략한 흐름을 보자.

 

송신쪽에서 데이터를 세그먼트에 담은 후, 해당 세그먼트를 쪼개 패킷에 담아, 프레임을 통해서 수신쪽으로 보내게 된다.

분해는 조립의 역순이다. 수신 쪽에서는 차례대로 프레임을 풀고, 패킷을 풀고, 세그먼트를 받게 된다. 이때 도착한 세그먼트 sequence번호가 1번과 2번이라면, 수신 측은 잘 받았다는 의미로 송신 쪽에 Ack 3번을 날리게 된다

(송신 측은 이를 기다리고 있다. TCP가 UDP에 비해 성능 저하가 되는 이유이기도 하다).

 

이때 날아가는 Ack에는 window size도 같이 담기게 되는데, 이는 수신 측에서 세그먼트를 담을 수 있는 사이즈인 TCP 버퍼 크기이다. 송신 측에서는 이 수신 측의 window size를 보고 현재 보내려는 세그먼트 크기가 담길 수 있을 경우 다음 세그먼트를 보내게된다.(Congestion control)

 

만약 공간이 부족하면? wait가 걸려 대기하게 된다.

(TCP/IP의 TCP 버퍼 내의 세그먼트들은 소켓으로 보내지게 된다. 하지만 만약 수신 측 프로세스에서 해당 올려 보내는 작업이 늦어지게 되면 버퍼 내부 공간이 부족해지게 되는 것이다. 즉, 네트워크 속도보다 끌어 올려지는 작업의 속도가 빨라야 wait하는 작업 시간이 걸리지 않게 되는 것이다.)


reference