TCP 통신을 알아보자

권기현·2024년 8월 7일

Network

목록 보기
1/1

TCP(Transmission Control Protocol)

TCP는 OSI 7계층의 4계층 (Transport) 레벨이며 때로는 3 계층 즉, Network의 IP 프로토콜과 함께 사용되기 때문에 "TCP/IP"라고도 불립니다.

UDP와 다르게 안전한 데이터 통신을 보장하는 프로토콜입니다. TCP의 연결 과정을 살펴보면 왜 안전한 통신인지 확인 할 수 있습니다.

Three way handshake

  1. 클라이언트는 서버에게 연결 요청의 SYN이라는 비트를 1을 만들어 TCP 헤더 정보를 설정하고 패킷을 생성하여 보낸다.

  2. 서버는 받은 패킷을 기반으로 수신처 포트 번호에 해당하는 소켓을 찾고 거기에 해당 클라이언트에 대한 정보를 저장한다.

  3. 서버는 마찬가지로 SYN 비트를 만들고 정상적으로 처리했다는 걸 알리기 위해 ACK 비트를 1로 해서 클라이언트에게 패킷을 보냅니다.

  4. 클라이언트는 받은 패킷 정보를 기반으로 서버 측의 접속 동작이 성공했는지 확인합니다.

  5. 클라이언트는 서버가 정상적으로 처리됐다는 것을 인지하고 자신도 패킷을 제대로 받았다는 것을 알리기 위해 ACK 비트를 1로 만들고 패킷을 만들어 서버에게 전송을 합니다.
    이로써 소켓은 데이터를 송수신할 수 있는 상태가 됩니다.

이러한 일련의 초기 연결 과정을 Three way handshake라고 불리웁니다. SYN 1을 보내고 SYN와 ACK를 보내고 마지막으로 ACK를 보내기 때문입니다. 다음은 three way handshake를 도식화한 이미지입니다.

TCP 세그먼트

TCP 세그먼트는 헤더와 데이터 필드로 나눠집니다.

헤더에는 다음과 같은 요소들이 있습니다.

  • Source Port: 데이터를 발송하는 애플리케이션의 포트 번호입니다.
  • Destination Port: 데이터를 수신하는 애플리케이션의 포트 번호입니다.
  • Sequence Number(SYN): TCP 통신 과정에서 데이터를 일정 단위로 분할하는데요. 분할된 데이터의 순서입니다.
  • Acknowledgment Number(ACK): 데이터를 수신하는 애플리케이션 입장에서, 다음으로 받고 싶은 TCP 세그먼트의 Sequence Number입니다.

TCP가 데이터를 순서대로 도착하는 것은 아닙니다. 네트워크 계층에서 RIP(Routing Information Protocol)과 같은 데이터 패킷 전달 프로토콜을 통해서 각 패킷들을 다른 경로로 유동적으로 나눠서 보낼 수 있기 때문입니다. 따라서 도착 순서는 정렬 상태를 보장할 수는 없지만 UDP와는 다르게 헤더에 포함된 SYN로 정렬시킬 수 있습니다.

ACK를 통해서 UDP와 다르게 상대방이 해당 패킷을 받았다는 것을 알 수 있기 때문에 안전한 통신이라고 합니다.

0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |       |C|E|U|A|P|R|S|F|                               |
   | Offset| Rsrvd |W|C|R|C|S|S|Y|I|            Window             |
   |       |       |R|E|G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           [Options]                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               :
   :                             Data                              :
   :                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+




참고

https://datatracker.ietf.org/doc/html/rfc9293

https://docs.tosspayments.com/resources/glossary/tcp

https://valueelectronic.tistory.com/102

https://www.cloudflare.com/ko-kr/learning/ddos/glossary/tcp-ip/

https://s3-ap-northeast-1.amazonaws.com/exemdocuments/intermax/wh-apm_TCP.pdf

profile
혼자 하는 개발은 없다고 생각하는 개발자

0개의 댓글