TCP 송수신 디테일
TCP 송수신 디테일

TCP 송수신 디테일

설명
소켓 프로그램 개발자, 운영체제 개발(혹은 튜닝) 가능자, 네트워크 관리자...이 세 가지 관점을 모두 이해하면 알 수 있는 TCP Segment 송수신 원리
Last Updated
Last updated August 26, 2023
태그
Linux
OS
💡
아래영상을 보며 정리한 내용입니다.
Video preview
 
TCP/IP 연결(3-way handshake)은 되어있다 가정하고, File download를(Server to Client) 받는 상황을 가정해보자
  • Web server 에서 socket이 열려 있으며 client에 접속중
    • Servers는 Process, Socket은 File이며, Process가 File에게 할수있는 operation은 RWX이며, 소켓에 대해서는 RW만 할것이다. (소켓 통신엔 당연히 실행 개념 x)
      • 소켓통신에서 RW는 다음과 같은 의미를 가진다. R: Receive, W: Send
  • HDD에서 1.4MB 를 읽을때에는 프로그램에 할당된 Memory 단위 (ex 64kb)만큼씩 끊어서 읽게된다.
  • Socket → TCP에서는 Socket Buffer와 TCP Buffer 각각 존재하고, Socket → TCP로 이동한다. Buffered I/O
    • 꼭 이렇게 해야하는건 아니지만, 주로 이렇게 함
    • 왜 이렇게 하는지는 할말이 많다… 크기를 어떻게 지정하는지도 할말이 많다…
  • TCP → IP에서는 TCP memory에 있는 내용을 Segment 단위로 쪼갠다.
    • 각 segment에 번호를 붙이며 쪼개짐
    • Packet은 택배박스에 비유할 수 있다. 쪼개진 segment를 넣은
    • 이 Packet이 Client쪽으로 전달되게 된다.
    • 택배 배달부는 안에 내용물(Packet)은 관심없고, 트럭(FRAME, L2 level)으로 그대로 넣게된다.
      • 트럭은 여러번 갈아타는 상황에서, 트럭의 목적지는 어디지?
  • Client에 도착한 다른 트럭
    • Frame은 Client의 IP에서 Packet (택배박스)
    • TCP에서는 Packet(택배박스)를 까서 segment로 튀어나올것이다.
    • 이 segment에서는 번호가 붙어있고, TCP Buffer에 원래대로 정돈된다.
      • segment가 2개쯤 오면 조립을 하고 잘 수신했다고 서버에게 알린다. (ACK)
      • ACK#3 : 1, 2번 잘받았다. 3번 달라
      • 서버쪽에서는 ACK#3을 받은 후에야 3번을 보낸다. → 이거 떄문에 TCP가 UDP보다 느림
  • Client TCP에는 아직 Buffer 여유가 있다. window size (수신측에서 segment를 날라오면 집어넣을 수 있는 공간)
    • ACK#3에 window size를 포함하고 있다.
    • 이 window size를 보고 3번 packet을 보낼까 말까 결정한다.
      • window size > message size → 보낸다
      • window size < message size → wait
    • 주로 느리다는 것 → client TCP Buffer를 빨리 퍼올려서 Client Process로 보내야하는데 Client Process의 Receive 속도가 느린것
      • Client Process Read 속도 < Network 수신 속도 → TCP Buffer의 여유가 점점 줄어든다.
      • ⇒ window size를 check하면, application의 문제 원인을 파악하기 좋다.
        • window size가 점점 줄어든다 → 네트워크 수신 속도보다 Client Process Read속도가 느린것 → Network가 아닌 프로그램이 문제이다
        •