🕸️ Network

TCP/IP

정의

Transmission Control Protocol
프로세스 간 통신에서 데이터를 안정적으로 주고받을 수 있도록 하는 프로토콜
  • 송신자가 수신자에게 IP 주소를 사용하여 데이터를 전달하고
  • 그 데이터가 제대로 갔는지, 너무 빠르지는 않는지, 제대로 받았다고 연락은 오는지에 대한 이야기를 하는 것

목적 및 특징

notion image

특징

  • 인터넷이 발명되면서 함께 개발된 프로토콜 스택
  • Connection 지향형
  • IETF에서 인터넷 표준을 관리(RPC)
  • TCP, UDP, IP 등 스펙은 RFC에서 정의
    • notion image

Application

  • 어플리케이션 레벨이서 구현/관리
  • 네트워크 기능을 사용하는데 목적

System

  • 하드웨어/펌웨어, OS 레벨에서 구현/관리
  • 네트워크 기능을 지원하는데 목적

Port

  • 프로세스와 연결된 data path / data channel
  • 16 bits 숫자(0 - 65535)
  • Port Name으로 식별
  • 0 - 1023: Well-Known Ports, System Ports
    • HTTP(80), HTTPS(443), DNS(53)
  • 1024 - 49151: Registered Port (IANA에 등록된)
    • MYSQL DB(3306), Apache Tomcat Server(8080)
  • 49152 - 65635: Dynamic Ports
    • 등록 안된 포트, 임시/자동 할당

IP(Internet Protocol)

  • 신뢰할 수 없음
  • 데이터 유실 가능
  • 전송 순서 변경 가능

UDP(User Datagram Protocol)

  • Connectionless: 연결을 맺지 않고 바로 데이터를 주고 받음
  • 신뢰할 수 있는: internet protocol을 거의 그대로 이용
  • TCP/IP stack 개념과 함께 UDP에서도 Socket 개념 사용
    • Protocol, IP Address, Port Number로 고유하게 식별

Connection

  • 프로세스 간 안정적인 논리적 통신 통로
  • 3 Way Handshake로 Connection을 열고, 데이터를 주고 받고
  • 4 Way Handshake로 Connection을 닫는다.

인터넷 상에서 어떻게 port를 고유하게 식별할까?

IP

  • IP는 패킷들의 관계를 이해하지 못하고 그저 목적지를 제대로 찾아가는 것에 중점을 둔다면

TCP

  • TCP는 통신하고자 하는 양쪽 단말(Endpoint)이 통신할 준비가 되었는지, 데이터가 제대로 전송되었는지, 데이터가 가는 도중 변질되지는 않았는지, 수신자가 얼마나 받았고 빠진 부분은 없는지 등을 점검합니다.
    • 이런 정보는 TCP Header에 담겨 있으며 SYN, ACK, FIN, RST, Source Port, Destination Port, Sequence Number, Window size, Checksum과 같은 신뢰성 보장과 흐름 제어, 혼잡 제어에 관여할 수 있는 요소들도 포함되어있습니다.
      또한 IP Header와 TCP Header를 제외한 TCP가 실을 수 있는 데이터 크기를 세그먼트(Segment)라고 부릅니다.
  • TCP는 IP의 정보뿐만 아니라 Port를 이용하여 연결합니다.
    • 한쪽 단말(Endpoint)에 도착한 데이터가 어느 입구(Port)로 들어가야 하는지 알아야 연결을 시도할 수 있기 때문이지요. 위의 TCP Header를 보시면 Source Port와 Destination Port를 확인할 수 있습니다. 예를 들어, 양쪽 단말(Endpoint)이 HTTP로 이루어진 문서를 주고받고자 할 경우 데이터 통신을 하려면 Endpoint의 3306 Port도 아니고, 21 Port도 아닌 80 Port로 연결해야 합니다. 거대한 부산항에 도착했을 때 화물선인 나의 데이터가 상항(화물이 정박하는 항)에 들어가야지 어선항(어선이 정박하는 항)에 들어가면 안 되는 것처럼 말입니다.
  • 흐름 제어
    • 송신자는 자신이 한 번에 얼마나 보낼 수 있는지, 수신자는 자신이 데이터를 어디까지 받았는지 끊임없이 확인하고 TCP Header 내의 ‘Window Size'를 사용해 한번에 받고/보낼 수 있는 데이터의 양을 정합니다. 여기서 window는 일정량의 데이터를 말합니다. 아무래도 받는 측의 사정이 더 중요하다 보니 Window size는 수신자가 정합니다.(3-way handshake 때 정합니다.) 그리고 자신의 상황에 따라 'Window size'를 조절합니다. 그리고 자신이 지금까지 받은 데이터 양을 확인하여 송신자에게 보내는데 이를 ‘Acknowledgment Number'라고 합니다. 만약 수신자가 300번째의 데이터를 받았으면 Acknowledgment Number에 1을 추가하여 301을 보냅니다. 300번까지 받았으니 301번부터 보내라는 뜻이지요. 그리고 이 데이터의 순서 번호를 표기한 것이 바로 ‘Sequence Number'입니다.
  • TCP의 특징 두 번째는 혼잡 제어입니다.
    • 데이터를 주고받는 양 단말(Endpoint)도 중요하지만 데이터가 지나가는 네트워크망의 혼잡 또한 중요합니다. 다양한 방법이 있습니다만 그중에 ‘Slow Start'에 대해 언급하고자 합니다. 연결 초기에 송신자와 수신자가 데이터를 넉넉히 주고받을 준비가 되어있더라도 중간 경로인 네트워크가 혼잡하다면? 제대로 보낼 수 없을 것이 자명합니다. 그리하여 송신자는 연결 초기에 데이터 송출량을 낮게 잡고 보내면서 수신자의 수신을 확인하며 데이터 송출량을 조금씩 늘립니다. 그리하게 되면 현재 네트워크에서 가장 적합한 데이터 송출량을 확인할 수 있게 됩니다. 이것이 'Slow Start'입니다.

예시

 

Transport Layer(4 Layer)

송신자와 수신자의 논리적 연결(Connection)을 담당하는 부분으로, 신뢰성 있는 연결을 유지할 수 있도록 도와줍니다. 즉 Endpoint(사용자) 간의 연결을 생성하고 데이터를 얼마나 보냈는지 얼마나 받았는지, 제대로 받았는지 등을 확인합니다. TCP와 UDP가 대표적입니다.

Network Layer(3 Layer)

IP(Internet Protocol)이 활용되는 부분으로, 한 Endpoint가 다른 Endpoint로 가고자 할 경우, 경로와 목적지를 찾아줍니다. 이를 Routing이라고 하며 대역이 다른 IP들이 목적지를 향해 제대로 찾아갈 수 있도록 돕는 역할을 합니다.

3-Way Handshake

TCP를 사용하는 송신자와 수신자는 데이터를 전송하기 전 먼저 서로 통신이 가능한 지 의사를 묻고 한 번에 얼마나 받을 수 있는지 등의 정보를 확인합니다. 앞서 언급했던 신뢰성 있는 통신을 하기 위함입니다. 데이터를 안전하고 빠지는 부분 없이 보내기 위함이지요. 여러분이 친구와 통화할 때를 어떻게 하시는지 떠올려보면 좋을 것 같습니다.
첫 번째, 전화번호를 누릅니다. 상대방의 전화기가 꺼져있지 않다면 연결음이 들리면서 연결을 시도합니다. 두 번째, 상대방이 전화를 받았고, 상대방의 목소리가 잘 들립니다. 세 번째, 여러분은 "여보세요?" 한 마디와 함께 상대방이 자신의 목소리가 잘 들리는지 확인을 한 후, 대화를 시작합니다.
TCP도 이와 동일합니다. 다만 TCP는 TCP Header 내의 'SYN', 'SYN/ACK', 'ACK' Flag을 사용하여 통신을 시도합니다.
첫 번째, 송신자가 수신자에게 'SYN'을 날려 통신이 가능한지 확인합니다. 이때 Port가 열려 있어야 합니다. 두 번째, 수신자가 송신자로부터 'SYN'을 받고 'SYN/ACK'을 송신자에게 날려 통신할 준비가 되어있음을 알립니다. 세 번째, 송신자가 수신자의 'SYN/ACK'을 받고 'ACK'를 날려 전송을 시작함을 알립니다.
notion image
TCP로 이루어지는 모든 통신은 반드시 3-way handshake를 통해 시작합니다. 수신자가 받을 생각이 있는지 준비가 되어있는지 송신자가 보낼 준비가 되어 있는지를 미리 확인한 후 통신을 시작하여 데이터를 안전하게 보내는 것입니다. 그리고 데이터를 받았을 때 잘 받았음을 알리는 'ACK'를 송신자에게 날립니다. 송신자는 이 'ACK'를 보고 수신자가 데이터를 잘 받았음을 확인하고 다음 데이터를 전달할 준비를 합니다. 이 밖에 주로 사용하는 Flag으로는 RST, FIN, FIN/ACK, PUSH 등이 있습니다. 이것까지 설명하면 문서가 너무 길어지니 생략하겠습니다. 다음으로 TCP의 특징을 통해 어떤 수단을 이용하여 신뢰성을 유지하는지 간략하게 알아보겠습니다.

장점

단점

단점 극복 방법

비교군과의 차이

질문

출처