Dev.Std

TCP/IP (Transmission Control Protocol/Internet Protocol) 본문

📂Basic/Network

TCP/IP (Transmission Control Protocol/Internet Protocol)

expr01 2024. 11. 7. 15:43

TCP/IP란?

인터넷 프로토콜 슈트(Internet Protocol Suite)는 인터넷에서 컴퓨터들이 서로 정보를 주고 받는데 쓰이는 프로토콜의 모음을 의미하는데, 여기서 TCP와 IP가 가장 많이 쓰이기 때문에 TCP/IP 프로토콜 슈트라고도 불린다.

 

TCP/IPTransmission Control Protocol / Internet Protocol 의 약자로 인터넷 네트워크 통신에 널리 쓰이고 있는 프로토콜이다. TCP/IP를 묶어서 하나로 표현하기는 하지만 사실 TCP와 IP는 별개의 프로토콜이다.

TCP/IP는 네트워크를 통해 데이터가 어떻게 전달되는지를 정의하고 기기 간 신뢰성 있는 통신을 보장한다.

 

IP를 사용할 때 패킷의 전달 여부와 순서를 보장받지 못하지만, TCP가 IP 위에서 동작하면서 데이터의 전달을 보장하고 보낸 순서대로 받을 수 있도록 해준다. HTTP, FTP, TLS/SSL 등 TCP 기반에서 동작하는 다양한 프로토콜들이 IP위에서 동작하기 때문에, 묶어서 TCP/IP라고 부르기도 한다.


TCP/IP 계층

OSI 계층은 총 7개의 계층(물리, 데이터 링크, 네트워크, 전송, 세션, 표현, 응용)으로 나누어졌지만, TCP/IP는 총 4개의 계층(네트워크 접근, 인터넷, 전송, 응용)으로 나누어진다.

OSI, TCP 차이

1계층 - 네트워크 인터페이스 계층 (Network Interface(Acess) Layer)

주요 기능

  • 네트워크 인터페이스 계층은 물리적 네트워크 매체를 통해 데이터 패킷을 실제로 전송하며, 네트워크 하드웨어를 제어함으로써 상위 인터넷 계층이 하위 하드웨어 동작에 신경 쓰지 않고 원활하게 작동할 수 있도록 지원
  • MAC 주소를 사용하여 데이터 출발지, 목적지 식별
  • 상위 계층에서 받은 데이터(패킷)을 프레임(Frame)으로 캡슐화하여 전송

프로토콜

Protocol Description
Ethernet (IEEE 802.3*) 유선 LAN에서 데이터를 전송하기 위한 기술
무선 LAN (IEEE 802.11*) 무선 LAN에서 데이터를 전송하기 위한 기술
더보기

*IEEE 802.3: 이더넷(Ethernet) 네트워크 표준으로, 유선 LAN에서 데이터 전송을 위한 프로토콜과 기술을 규정
*IEEE 802.11: 무선LAN(WLAN) 기술 표준으로, Wi-Fi 네트워크를 위한 프로토콜과 기술을 규정

 

IEEE(Institute of Electrical and Electronics Engineers)는 전기 및 전자 공학 분야에서 세계적으로 인정받는 전문 기관이다.

1963년에 설립된 IEEE는 전기, 전자, 컴퓨터 공학 및 관련 분야의 기술 발전을 촉진하는 비영리 조직이다.

 

2계층 - 인터넷 계층 (Internet Layer)

주요 기능

  • 호스트 간의 데이터 패킷 전송을 관리하고, 네트워크 간의 라우팅을 수행
  • IP를 이용하여 패킷을 전송할 목적지 주소를 찾음
  • 상위 계층에서 받은 데이터(세그먼트)를 패킷(Packet)으로 캡슐화하여 전송

프로토콜

Protocol Description
IP (Internet Protocol) 인터넷 프로토콜을 의미, 패킷 헤더의 IP 주소를 확인하여 목적지까지 패킷을 전달하는 역할
ICMP (Internet Contorl Message Progtocol) 네트워크 장치에서 네트워크 통신 문제를 진단하는데 사용하는 프로토콜
ARP (Address Resolution Protocol) IP주소에 맞는 물리적 네트워크 주소(MAC address)를 찾는 프로토콜

 

3계층 - 전송 계층 (Transport Layer)

주요 기능

  • 패킷 손실 시 재전송 요청을 통해 데이터의 무결성을 유지
  • 송신자와 수신자 사이의 데이터 전송 속도를 조절하여 수신자가 처리할 수 있는 양만큼만 데이터를 전송(흐름 제어)
  • 네트워크의 혼잡을 피하기 위하여 송신 측에서 보내는 데이터의 전송 속도를 조절(혼잡 제어)
  • 큰 데이터 블록을 세그먼트(Segment)로 나누어 전송하고, 수신 측에서 다시 조합하여 원래의 데이터로 복원
  • 포트(Port)를 통해 각 애플리케이션에 데이터를 전달

프로토콜

Protocol Description
TCP (Transmission Control Protocol) 연결형으로 신뢰성 있는 데이터 전송과 순서 보장을 제공하는 전송 계층 프로토콜
UDP (User Datagram Protocol) 비연결형 방식으로 빠른 데이터 전송을 제공하지만 신뢰성과 순서 보장을 하지 않는 전송 계층 프로토콜

 

4계층 - 응용 계층 (Application Layer)

주요 기능

  • 사용자와 직접 상호작용하는 소프트웨어 애플리케이션이 위치하는 계층

프로토콜

Protocol Description
HTTP (Hypertext Trasfer Protocol) 웹 상에서 정보를 주고 받을 때 사용하는 프로토콜
FTP (File Transfer Protocol)
TFTP (Trivial File Transfer Protocol)
각각 TCP, UDP 환경에서 파일을 전송할 때 사용하는 프로토콜
Telnet 원격 시스템의 가상 터미널에 접속할 때 지원하는 프로토콜
SMTP 전자 우편 전송을 위한 인터넷 표준 통신 프로토콜
DNS 도메인 이름과 IP 주소를 서로 변환하는 역할을 하는 프로토콜

 


TCP 연결 및 종료 과정

3-Way Handshake

TCP는 신뢰성 있는 데이터 전송을 위해 먼저 연결을 설정하는데, 이 때 연결하는 방법을 3-Way HandShake 라고 한다.

3-Way HandShake - 연결 생성 과정

1. SYN Sent (Client -> Server):

  • 두 시스템이 통신 하기 전 상태는 포트가 Closed 상태이며, 서버는 해당 포트로 항상 서비스를 제공할 수 있는 Listen 상태다.
  • 클라이언트가 처음 통신을 하고자 하면, 임의의 포트 번호가 클라이언트에 할당되고 클라이언트는 SYN Sent 상태가 된다. SYN Sent는 서버에 연결을 하고 싶다는 의사 표시다.
  • 서버 연결 요청 패킷에는 SYN 플래그가 설정되어 있으며, 클라이언트의 초기 시퀀스 번호(Initial Sequence Number, ISN)가 포함된다.
  1. SYN-ACK Sent (Server -> Client):
    • 서버는 클라이언트의 SYN 패킷을 받고, SYN Received 상태가 된다. 그리고 자신의 SYN과 클라이언트의 SYN에 대한 확인 응답(ACK)을 포함한 패킷을 클라이언트로 보낸다. 이 패킷은 SYN-ACK 패킷이라고 불리며, 연결을 해도 좋다는 의미를 가진다.
    • SYN-ACK 패킷은 SYN 플래그에 서버의 ISN이 ACK 플래그에 클라이언트의 ISN + 1이 포함된다.
  2. ACK Sent (Client -> Server):
    • 클라이언트는 서버의 SYN에 대한 확인 응답(ACK)을 보내며, 연결이 확립된다. 이 단계에서 클라이언트는 Established 상태로 전환된다.
    • 이때 ACK 패킷에는 서버의 ISN + 1이 포함된다.
    • 마지막으로 서버 역시 클라이언트의 ACK를 받은 후 Established 상태로 전환되고, 데이터 전송을 위한 준비를 마친다.

 

4-Way Handshake

연결 및 데이터 전송이 끝나면 연결 종료 과정이 진행된다. 이를 4-Way Handshake라고 한다.

4-Way-Handshake - 연결 해제 과정

  1. FIN Sent (Client -> Server):
    • 클라이언트가 서버에게 FIN 플래그가 설정된 패킷을 전송한다. 이 패킷은 더 이상 데이터를 전송하지 않겠다는 뜻을 가지고 있다.
    • FIN 패킷을 보낼 때, 현재까지 사용한 시퀀스 번호로 패킷을 보내며, 클라이언트는 FIN Wait 1 상태로 전환된다. 
  2. ACK Sent (Server -> Client):
    • 서버가 클라이언트에게 FIN 패킷을 받으면 이에 대한 ACK(Client Seq + 1) 패킷을 보내고 Close Wait 상태로 전환된다. 이는 서버가 클라이언트에게 FIN 패킷을 받았으나 자신이 FIN 패킷을 보내지 않았음을 의미한다.
    • 서버는 Close Wait 상태동안 자신의 통신이 다 끝날 때까지 기다린다.
    • 이 때 클라이언트는 서버에게 ACK 패킷을 받은 후 FIN Wait 2 상태로 전환한다. 이 상태는 더 이상 서버에게 데이터를 보내지 않고 서버의 FIN 패킷을 기다리는 상태이다.
  3. FIN Sent (Server -> Client):
    • Close Wait 상태에서 남은 작업이 다 끝나면 서버는 클라이언트에게 FIN(Server Seq) 패킷을 보내고 Last ACK 상태로 전환한다. Last ACK는 클라이언트에게 마지막 응답을 받겠다는 의미이다.
    • 이 때 클라이언트는 서버에게 FIN 패킷을 받고 Time Wait 상태로 전환한다. 이 상태에서는 클라이언트가 일정 시간 동안 추가 패킷이 올 수 있는지 기다린다.
  4. ACK Sent (Client -> Server):
    • 클라이언트가 서버의 FIN 패킷을 수신 후, ACK(Server Seq + 1) 응답을 보낸다. 이후 클라이언트가 Closed 상태로 전환되고, 서버도 클라이언트의 ACK를 수신 후 Closed 상태로 전환되고 연결이 완전 종료된다.
더보기

Time Wait 상태는 네트워크 환경에서 패킷이 전송 지연 또는 네트워크 혼잡 등의 이유로 늦게 도착하거나 손실 될 경우에 안전한 데이터의 전송을 보장하는 상태라고 볼 수 있다. 
따라서 서버에서 보낸 FIN 패킷보다 먼저 보냈던 데이터가 네트워크 전송지연, 혼잡 등의 이유로 늦게 도착할 경우 데이터의 손실이 일어나기 때문에 클라이언트는 일반적으로 2MSL (Maximum Segment Lifetime) 만큼 기다리면서 남은 패킷이 안전하게 도착할 수 있도록 한다.
이때 MSL은 패킷이 네트워크 상에서 살아있을 수 있는 최대 시간을 의미한다.
또한 클라이언트의 마지막 ACK 패킷이 제대로 전송이 되지 않은 경우 서버가 FIN 패킷을 다시 보내면서 클라이언트가 ACK 패킷을 다시 보내도록 한다.


TCP/IP 패킷 전송 과정

TCP/IP 데이터 전송 과정

TCP/IP에서 송신 측이 패킷을 전송할 때는 각 계층마다 헤더에 정보가 추가하는 인캡슐레이션(Encapsulation)이 진행되고, 전송 후 수신 측에서는 각 계층에서 헤더를 제거하는 디캡슐레이션(Decapsulation)이 진행된다. 인캡슐레이션과 디캡슐레이션은 서로 역순으로 진행된다.


TCP/IP 패킷 구성

IP Header

RFC 791. IP Header Structure

  • Version(4 bits): Internet Protocol의 버전 (IPv4, IPv6), 아직은 IPv4를 많이 사용
  • IHL(Internet Header Length, 4 bits): IP 헤더의 길이
  • Type of Service(8 bits): IP 패킷의 우선 순위 정함, 주요 기능은 아래와 같음
    • 0~2 bits: Precedence(우선순위)
    • 3 bits: 지연(Delay) 설정 (0 = 일반 지연, 1 = 낮은 지연)
    • 4 bits: 대역폭(Throughput) 설정 (0 = 일반 대역폭, 1 = 높은 대역폭)
    • 5 bits: 신뢰성(Reliability) 설정 (0 - 일반 신뢰성, 1 = 높은 신뢰성)
    • 6~7 bits: 향후 사용 위한 예약 비트
더보기

Precedence (우선순위)
111: 네트워크 제어 (Network Control)
110: 인터네트워크 제어 (Internetwork Control)
101: 긴급(CRITIC/ECP)
100: 플래시 우선 (Flash Override)
011: 플래시 (Flash)
010: 즉각적 (Immediate)
001: 우선 (Priority)
000: 일반 (Routine)

  • Total Length(16 bits): IP 패킷의 전체 길이를 바이트 단위로 나타냄(20 ~ 65535 byte)
  • Identification(16 bits): 각 패킷을 식별하는 번호, 패킷 재조합 위해 사용 
  • Flags(3 bits): 패킷의 분할과 조립을 제어하는데 사용
    • 0 bit: 예약되어 있으며, 항상 0값을 가짐 
    • 1 bit: DF(Don't Fragment)로 패킷이 분할 가능할 때 0, 패킷이 분할되면 안될 때 1 값을 가짐
    • 2 bit: MF(More Fragment)로 마지막 조각일 때 0, 뒤에 추가적인 조각이 있을 때 1 값을 가짐
  • Fragment Offset(13 bits): 패킷의 순서에 대한 정보를 8byte 형태로 나타냄, 8을 곱하면 패킷 삽입 위치가 됨, 첫번째 패킷은 0 offset을 가짐
  • Time to Live(8 bits): 패킷이 네트워크를 통해 전송될 수 있는 최대 홉 수, 라우터를 통과할 때마다 TTL이 1씩 감소, 0이 되면 패킷은 소멸. 패킷이 네트워크 상에서 무한루프에 빠지는 것을 방지하기 위함.
  • Protocol(8 bits): 상위 계층 프로토콜을 나타냄 
  • Header Checksum(16 bits): IP 헤더의 오류를 검출하기 위한 체크섬 값, 데이터 무결성 확인
  • Source Address(32 bits): 출발지 주소
  • Destination Address(32 bits): 목적지 주소
  • Options(variable): 특별 처리 옵션이 들어가는 필드
  • Padding(variable): 헤더가 4byte 경계에서 끝날 수 있도록 부족한 부분을 채워 넣음

TCP Header

RFC 9293. TCP Header Structure

  • Source Port(16 bit): 출발지 포트
  • Destination Port(16 bit): 도착지 포트
  • Sequence Number(32 bit): 세그먼트의 순서 번호, SYN flag = 1인 경우 초기 시퀀스 넘버(ISN)을 나타내고 데이터를 전송할때는 ISN + 1(ISN에는 데이터가 포함되지 않기 때문)이 됨
  • Acknowledgment Number(32 bits): ACK 제어 비트 설정된 경우, 수신자가 수신할 것으로 예상되는 다음 시퀀스 번호를 포함. 
  • Data Offset(4 bits): TCP 헤더의 길이를 4 byte로 나타냄
  • Rsrvd(4 bits): 향후 사용을 위해 예약됨. 현재는 생성 시 0값을 가지며 수신 측에서 무시
  • Flag(1 bit each)
더보기

CWR(Congestion Windows Reduced): 네트워크 혼잡 상태 해결
ECE(Explicit Congestion Notification):
네트워크 혼잡 감지
URG(Urgent):
긴급 데이터 포함
ACK(Acknowledgment):
해당 세그먼트가 응답을 포함
PSH(Push):
수신 측에서 데이터를 즉시 처리해야 함
RST(Reset):
연결 재설정 해야함
SYN(Synchronize):
TCP 연결 위한 동기화 요청

FIN(Finish): 연결 종료 요청

  • Window(16 bits): 수신자 버퍼에 남아 있는 공간 기준 수신자가 수신할 수 있는 데이터의 양
  • Checksum(16 bits): 데이터 전송의 무결성을 확인하기 위한 계산 값
  • Urgent Pointer(16bits): 긴급 데이터의 위치, URG 플래그가 설정되었을 때 유효
  • Options(variable): 세그먼트 크기(MSS), 윈도우 크기(Windows Scale) 등을 협상함
  • Data(variable): TCP 세그먼트에서 전송되는 사용자 데이터