TCP 송/수신

파이리·2023년 7월 26일

네트워크 기초

목록 보기
17/26

TCP 송/수신 원리

Server

서버 프로세스는 소켓에 ReceiveSend를 할 수 있다.

보조 기억장치에 파일을 보관하고 파일 시스템을 통해 파일을 관리하고 드라이버를 통해 파일 시스템과 보조 기억장치가 정보를 주고 받습니다.

Server에는 메모리 즉, 버퍼를 할당합니다. 이 때, 할당되는 메모리 크기는 개발자가 결정하지만 일반적으로 파일보다 작습니다. TCP에도 똑같이 버퍼가 존재합니다.

파일을 읽어올 때, Server에 할당된 메모리 크기만큼 파일을 잘라서 읽어옵니다. 읽어온 데이터를 소켓을 통해 TCP 버퍼로 복사합니다. 이러한 방식을 Buffered I/O 라고 합니다. TCP에서 IP로 데이터를 전달할 때 데이터를 분해하여 Segment로 만듭니다. 분해된 Segment는 몇 번째 조각인지 기억하고 있습니다. 이렇게 만든 SegmentPacket으로 인캡슐레이션 합니다.

Packet을 클라이언트에 전달하기 위해서 L2수준으로 내려와 Frame 데이터로 다시 한번 인캡슐레이션하여 전송합니다. Frame 데이터를 전달하는 과정에서 목적지에 따라 Frame이 사라졌다가 다시 생성되면서 최종 목적지에 도착합니다.

Client

Client 프로세스가 있고 TCP / IP와 통신하기 위한 소켓이 존재합니다. 소켓에는 FIle I/O Buffer를 가지고 있고, TCP에도 TCP Buffer가 존재합니다.

TCP Buffer의 사이즈를 Window Size라고 합니다. 즉, 이 사이즈는 데이터를 수신하는 측에서 받을 수 있는 데이터의 사이즈입니다.

서버에서 응답받은 Frame 데이터에서 IP 수준으로 이동할 때 Frame은 사라지게 됩니다. IP에서는 Packet을 디캡슐레이션 하여 Segment로 바꾸어 TCP로 전달합니다. 이 SegmentTCP Buffer에 분해된 순서대로 다시 조립하여 보관됩니다. TCP Buffer에 보관한 데이터를 소켓에서 읽어 File I/O Buffer에 복사합니다.

이 때, Segment를 잘 수신했다는 것을 알리고 다음 Segment를 요청하기 위해 ACK를 서버에게 보냅니다. 따라서 서버는 Segment를 보내고 ACK가 올 때까지 Wait를 합니다. 이로 인해 지연이 발생할 수 있습니다. ACK에는 Window Size로 함께 전송하여 Client 측에서 다음 데이터를 받을 수 있는 공간이 있는지 서버에서 판단합니다. 만일 수신 측의 Window SizeMSS보다 크면 전송하고 작다면 Wait가 걸립니다.

여기서 만일 소켓에서 TCP Buffer의 데이터를 읽어오는 속도보다 서버의 전송이 빠르다면 점점 Window Size가 점점 작아져 MSS보다 작아져 서버에서 Wait가 걸려 처리 지연이 발생하게 됩니다.

TCP 연결

연결이란?

TCP 연결은 암호화가 안되어 있어 기밀 유지가 안되고 무결성도 보장하지 못해 보안성이 없다.

TCP Header

  • Source Port
    • 16bit
    • 출발지
  • Destination Port
    • 16bit
    • 도착지
  • Sequence Number
    • 32bit
    • 분해된 Segment의 순으로 이 값을 통해 올바른 순서대로 재배열할 수 있다.
  • Acknowledgement Number
    • 다음 세그먼트를 수신할 준비가 되었다는 것을 알린다.
    • 즉, 모든 데이터를 수신했다는 메세지 역할을 한다.
  • Offset
  • Reserved
  • TCP Flags
  • Window
    • 수신 측의 가용할 수 있는 버퍼의 크기
  • Checksum
    • TCP 세그먼트 내용이 유효한지 검증하고 손상 여부를 검사
  • Urgent Pointer
  • TCP Options

3-Way handshake

  • Seq 번호 교환
  • MSS 사이즈 교환
  • 혼잡 제어 정책을 교환 ( 대표적으로 SACK )
  • 보안성이 약함

LAN 케이블을 뽑으면 TCP 연결은?

LAN 케이블이 Link-down 되고 일정 시간 동안 TCP 연결은 살아있습니다. 이는 TCP 연결이 논리적인 연결이기 때문에 가능하고 Link-down된 상태에서 TCP 연결이 살아있는 시간은 개발된 서버에 따라 다릅니다.

이때 물리적으로 L2 연결이 Link-down 되는 것을 네트워크 충격이라고 합니다. 이는 유선보다는 무선에서 자주 발생하게 됩니다.

profile
프론트엔드 개발자

0개의 댓글