본문 바로가기

CS/네트워크

TCP/IP

기본적으로 인터넷 프로토콜 상에서의 데이터 전송은 unreliable하다.

따라서 데이터를 안정적으로 보낼 수 있는 방법이 필요했는데, 그것이 바로 TCP(Transmission control protocol)이다.

unreliable은 데이터가 유실/손상 될 수 있고, 순서가 보장되지 않는 경우를 말한다.

 

TCP/IP Stack

1. Port

16bits로 이루어진 이루어진 숫자 (0~65535)

데이터를 주고 받기 위해서는 상대방 포트를 식별해야 하는데 인터넷 상에는 수많은 프로세스와 그 프로세스가 갖고 있는 포트들이 있기 때문에 포트만으로는 식별하기가 무척 어렵다.

따라서 IP를 통해 Host를 유니크하게 식별하고, Host 내의 포트는 각각 다른 번호를 부여하여 유니크하게 식별하는 방법인 Socket이 등장한다.

2. Socket

인터넷 상에 존재하는 각 Port를 유니크하게 식별하기 위한 주소 (IP + Port number)

3. Connection

프로세스 간의 안정적이고 논리적인 통신 통로

한 쌍의 Socket으로 Connection을 유니크하게 식별한다.

<protocol, src ip address, src port, dest ip address, dest port>

또한 하나의 Socket은 여러 개의 Connection에서 사용될 수 있다.

프로세스 간의 Connection을 연결할 때 3 Way-HandShake를 사용하며, 닫을 때 4 Way-HandShacke를 사용하여 Connection을 닫는다.

3 Way-Handshake

1. 송신 프로세스는 SYN 패킷과 함께 프로세스 B에게 연결 요청을 보낸다.

2. SYN 패킷을 받은 수신 프로세스는 SYN 패킷과 함께 응답 패킷인 ACK 패킷을 함께 보내 긍정 응답을 보낸다.

3. 마지막으로 송신 프로세스는 수신 프로세스가 보낸 긍정 응답이 제대로 도착했음을 알리는 세그먼트를 보냄으로써 연결이 완료된다.

 

위와 같이 연결을 하는 과정은 속도적인면에서 성능이 떨어질 수 있다.

그렇다면 송신 프로세스에서 SYN 패킷으로 연결 요청을 보낼 때 데이터도 함께 보낼 순 없을까?

 

TCP Fast Open

TCP Fast Open은 TCP 연결 요청 시 SYN패킷과 함께 데이터도 함께 전송함으로써 보다 빠르게 첫 데이터를 송수신할 수 있다.

이때 TFO 쿠키를 사용하여 요청을 하며 과정은 다음과 같다.

 

1차 연결은 TCP 3 HandShake와 거의 동일하다.

 

1. 연결 요청 시 SYN 패킷과 함께 TFO 쿠키를 요청한다.

2. 서버에서 SYN, ACK 패킷과 함께 TFO 쿠키를 같이 전송한다.

3. 데이터 주고 받다가 연결이 끊기고 재차 연결을 시도하는 경우

4. SYN 패킷과 1차 연결 때 받은 TFO 쿠키를 데이터와 함께 전송

 

4 Way-Handshake

  • 해제하고자 하는 프로세스에서 FIN 플래그를 지정하여 요구한다.
  • FIN 플래그를 받은 프로세스에서는 긍정 응답을 보낸다.
  • 이때 A 프로세스는 FIN-WAIT 상태가 되고, B는 CLOSE-WAIT 상태가 된다.
  • 이후 통신이 끝나면 B 프로세스는 A에게 FIN 플래그를 전송
  • A는 긍정의 응답을 B에게 전송

 

TCP Keep-Alive

위와 같이 각 프로세스는 ACK를 통해 패킷 도착 여부를 확인한다.

이처럼 서로의 연결을 ACK를 통해 확인하는 과정을 TCP Keep-Alive라고 한다.

 

TCP Keep-Alive는 OS를 통해 관리되며, ACK를 정상적으로 받지 못하면 OS측에서 TCP 연결을 종료한다.

 

4. Transport Layer

Multiplexing

여러 Socket으로 부터 데이터를 수집하여 각각 세그먼트(TCP) 또는 데이터그램(UDP)으로 변환 후 Internet Layer로 내려보내는 것

Demultiplexing

Internet Layer로부터 받은 세그먼트 또는 데이터그램에 있는 payload를 적절한 Socket으로 전달하는 것

'CS > 네트워크' 카테고리의 다른 글

TCP Header  (0) 2025.04.05
HTTP와 HTTPS 프로토콜  (0) 2025.03.21
프로토콜과 OSI 7 Layer  (0) 2025.03.06
네트워크 기초  (0) 2025.03.06