for Robot Artificial Inteligence

TCP 개념 2

|

TCP에 대해 구체적으로 알아보겠다. TCP에 중요한 개념을 다시한번 상기하자

TCP 정의

TCP란 Transmission Control Protocol 의 약어로 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜(协议))의 일종이다. TCP는 세계 통신 표준으로 개발된 OSI 모형에서 4번째 계층인 전송 계층(Transport Layer)에서 사용하는 규약으로, 보통 하위 계층에서 사용하는 IP와 엮어서 TCP/IP로 표현하는 경우가 많다.

  • 즉, 전송 계층에서 사용하는데, 하위 계층에서 사용하는 IP와 역어 TCP/IP로 표현된다.

TCP stands for Transmission Control Protocol which indicates that it does something to control the transmission of the data in a reliable way.

The process of communication between devices over the internet happens according to the current TCP/IP suite model(stripped out version of OSI reference model). The Application layer is a top pile of stack of TCP/IP model from where network referenced application like web browser on the client side establish connection with the server. From the application layer, the information is transferred to the transport layer where our topic comes into picture. The two important protocols of this layer are – TCP, UDP(User Datagram Protocol) out of which TCP is prevalent(since it provides reliability for the connection established). However you can find application of UDP in querying the DNS server to get the binary equivalent of the Domain Name used for the website

TCP 연결 설정

TCP는 전화를 거는 것처럼 상대와 연결을 설정하고 통신을 시작한다.

TCP provides reliable communication with something called Positive Acknowledgement(접수) with Re-transmission(PAR). The Protocol Data Unit(PDU) of the transport layer is called segment. Now a device using PAR resend the data unit until it receives an acknowledgement. If the data unit received at the receiver’s end is damaged(It checks the data with checksum functionality of the transport layer that is used for Error Detection), then receiver discards the segment. So the sender has to resend the data unit for which positive acknowledgement is not received. You can realize from above mechanism that three segments are exchanged between sender(client) and receiver(server) for a reliable TCP connection to get established. Let us delve how this mechanism works

공식적인 TCP 절차로 Three way Handshake

1) 상대에게 통신을 하고 싶다고 메세지를 보낸드 (SYN(Synchronize Sequence Number)) 2) 상대는 그 메세지에 대한 응답 + 나도 통신 준비가 되었다는 메세지를 보낸다. (SYN-ACK(Synchronize Sequence Number+Acknowledgement)) 3) 2번에서 받은 메세지에 응답을 보낸다(ACK)

이와 같이 과정을 통해 나와 상대가 통신준비를 맞쳤고, 현재, 통신이 연결되어 있음을 보장하게 된다. 기존의 회선 교환 방식의 개념과 유사하지만 단순히 서로 연결되어 있는 것만 보장한다.

  • Step 1 (SYN) : In the first step, client wants to establish a connection with server, so it sends a segment with SYN(Synchronize Sequence Number) which informs server that client is likely to start communication and with what sequence number it starts segments with
  • Step 2 (SYN + ACK): Server responds to the client request with SYN-ACK signal bits set. Acknowledgement(ACK) signifies(의미하다) the response of segment it received and SYN signifies with what sequence number it is likely to start the segments with
  • Step 3 (ACK) : In the final part client acknowledges the response of server and they both establish a reliable connection with which they will start the actual data transfer

The steps 1, 2 establish the connection parameter (sequence number) for one direction and it is acknowledged. The steps 2, 3 establish the connection parameter (sequence number) for the other direction and it is acknowledged. With these, a full-duplex communication is established.

Note – Initial sequence numbers are randomly selected while establishing connections between client and server.

TCP 통신에서 중요한점

  • 데이터 누락을 막고 Three handshake를 통해 항상 연결 상태를 유지해야한다
  • Client가 받을 수 있는 할당 데이터량이 있다. 그 한계를 넘어 버린 상태에서 서버가 데이터를 보내게 되면 데이터 누락이 생긴다.
  • 그렇기 때문에 Client측에서 한번에 받을 수 있는 데이터량을 Server에 보낸다.
  • ACK를 계속 보내서 잘 받았는지 잘 보내졌는지 확인 응답을 계속 보낸다.
  • 사용자가 많으면 네트워크 회선에 부하가 걸려서 사망하게 된다. 그렇기 때문에 TCP에서 Congestion Control 요소가 중요하다.

TCP 특징

현존하는 상당수의 네트워크 프로그램은 TCP를 기반으로 통신한다. 그만큼 데이터 신뢰성을 중요시하는 프로그램들이 많다. 이메일이나 파일 전송같은 경우 데이터 하나가 날아가면 꽤 골치아픈 문제가 발생한다. 하지만 TCP에서 제공하는 신뢰성 보장 방법들을 반드시 사용할 필요는 없다. 만약 프로그램에서 필요하지 않든다면 구현하는 과정에서 기능을 끌 수 있게 되어 있다. 물론 그만큼 신뢰성이 떨어지는 상황은 감수해된다.

  • 즉, 컴퓨터 간에 라우터로 네트워크를 전송 받을 때, TCP, C++의 데이터 구조에서 펑션이나 데이터 멤버들을 이용하여 이와 같은 규약을 지켜 데이터의 안전성과 흐름을 보장한다.
    • Three handshake
      • 1) SYN 2) SYN-ACK 3) ACK
    • Flow Control
    • Congestion Control 그 외에 TCP 자체가 오히려 비효율 적인 경우도 발생한다. 대표적으로 실시간성을 중요시하거나 응답성을 중요시하는 프로그램인데 이를 위해 개발 된것이 바로 UDP이다.

TCP 정리

  • TCP는 데이터 전달을 관리하는 규칙
  • 데이터를 작게 나누워서 한 쪽에서 다른쪽으로 옮기고, 이를 다시 조립하여 원래의 데이터로 만드는 규칙(Torrents)
    • 여기서 잘게 나뉜 데이터 단위를 패킷
    • 인터넷에서는 정보를 전달하는 단위
  • TCP는 패킷을 조립하고, 손실된 패킷을 확인하고, 재전송하도록 요청하는 기능

위에서 가장 기본이 되는 내용을 살펴보았다 그렇다면 자세히 TCP에 무슨 기능이 있고 어떻게 일을 하는지 살펴 보자

TCP가 가지고 있는 Function(기능)

  • 신뢰성 있는 전송(Reliable Transmission)
    • Dupack-based retransmission
      • 정상적인 상황에서 CLient나 Sever로부터 ACK의 요칭이 연속적으로 전송된다.
      • 그러나 특정 ACK가 중복으로 올 경우 패킷 이상을 감지하고 재전송을 요청한다.
    • Timeout-based Retransmission
      • 일정시간동안 ACK을 수신 못할 경우 재전송 요청
  • 흐름제어(Flow Control)
    • 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지한다.
    • 수신자가 윈도우 값을 통해 수신량을 정할 수 있다.
  • 에러 감지(Error Detection)
    • 데이터 변형, 분실 오류 방지
    • Check sum을 황용하여 데이터 변형 감지
  • 혼잡 제어(Congestion Control)
    • 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지
    • 정보의 소통량이 과다하면 패킷을 조금만 전송하여 혼잡 붕괴를 방지

TCP Header file

  • Source port/ Destination port
  • Sequence number
    • SYN = 1: 초기 시퀀스 번호. ACK번호는 이값에 1을 더한값
    • SYN = 0: 현재 섹션의 세그먼트 데이터에서 최초 바이트값의 누적 시퀀스 번호
  • Acknowledgement number
    • ACK = 1: 필드의 값은 수신자가 예상하는 다음 시퀀스 번호
  • header Length
    • 32-bit 워드 단위로 나타낸 TCP 헤더 크기 값
  • Reserved
    • 미래에 사용 하기 위해 남겨둔 예비 필드이며 0으로 되어 있어야 한다.
  • window size
    • 수신 윈도 크기
    • 0이면 송신 프로세스 전송 중시
  • checksum
    • 헤더 및 데이터의 에러 확인을 위해 사용되는 16 비트

TCP process in detail

  • TCP connection(3-way handshake)
    • 먼저 open()을 실행한 클라이언트가 SYN을 보내고 SYN_SENT 상태로 대기한다
    • 서버는 SYN_RCVD 상태로 바꾸고 SYN과 응답 ACK를 보낸다.
    • SYN과 응답 ACK을 받은 클라이언트는 ESTABLISHED 상태로 변경하고 서버에게 응답 ACK를 보낸다.
    • 응답 ACK를 받은 서버는 ESTABLISHED 상태로 변경한다.

TCP Question

한 개의 Server Socket에서 열 수 있는 최대 동시 연결 갯수는 65536개이다?

  • 정답은 X입니다.
  • 소켓은 protocol, source addr, source port, destination addr, destination port로 unique하게 구성됩니다
  • 소켓의 수는 설정된 리눅스 파일 디스크립터만큼 생성할 수 있습니다.

TCP는 데이터 순서 보장을 위해 한 번에 하나의 Packet만 전송할까?

  • 정답은 X입니다.
  • 많은 데이터를 매번 ACK를 받고 보내기엔 너무 많은 Cost가 필요합니다.
  • 위와 같은 문제를 해결하기 위해 Window라는 논리적인 패킷 묶음을 사용합니다
    • 최소한의 ACK로 데이터 순서를 보장하며 전송을 할 수 있습니다.

Reference

https://nesoy.github.io/articles/2018-10/TCP

Comments