티스토리 뷰

728x90
반응형

  본 포스팅은 TCP/IP에 대해 알아보겠습니다.


TCP/IP는 인터넷 네트워크의 핵심 프로토콜입니다. 인터넷에서 전송되는 정보나 파일들이 일정한 크기의 패킷들로 나뉘어 네트워크상 수많은 노드들의 조합으로 생성되는 경로들을 거쳐 분산적으로 전송되고, 수신지에 도착한 패킷들이 원래의 정보나 파일로 재조립되도록 하는 게 바로 TCP/IP의 기능입니다.

먼저 TCP/IP 4계층에 대해 알아보겠습니다.

Application Layer는 네트워크를 사용하는 응용프로그램(Telnet, FTP, SMTP등)을 제공하기 위한 계층입니다.
Transport Layer는 통신 노드(End-to-End)간 연결을 제어하고 자료의 송수신을 담당합니다.
Internet Layer는 통신 노드간 IP패킷을 전송하는 기능 및 라우팅(경로배정) 기능 담당합니다.
Physical Layer는 물리적 계층 즉 이더넷 카드와 같은 하드웨어입니다

 

그럼 실제로 TCP/IP에 의한 데이터 전송 과정을 알아보겠습니다.

1) 브라우저에서 서비스 도메인을 호출하면, 브라우저 내부에서 Name서비스를 이용하여 IP주소로 변경합니다.
2) 사용자의 요청(메시지)은 TCP패킷으로 만들어 집니다.
3) TCP패킷은 다시 IP패킷으로 만들어져서 이더넷 카드로 보내집니다.
4) TCP/IP패킷은 장치(라우터, 토큰링 등)를 통해서 웹 서버의 이더넷 카드로 전달됩니다.
5) 웹서버의 이더넷 카드는 TCP/IP패킷을 Internet Layer로 보내고, IP패킷의 발신지와 도착지를 알아냅니다.
6) 목적지가 자신의 IP이면 패킷을 Transport Layer로 보내고 메시지 검사를 거쳐 Application Layer로 전달합니다.
7) Application Layer 에서 웹서버가 메시지를 HTTP프로토콜에 준하여 검사하고 요청한 웹 페이지를 보냅니다.

 

다음으로 IP 헤더구조에 대해 알아보겠습니다.

Version(4bits)은 IP프로토콜 버전을 나타냅니다.
Internet Header Length(4bits)은 IP 헤더의 길이, 보통은 32bit 크기의 5개 열로 이루어 집니다.
Type Of Service(8bits)는 데이터 그램의 전송에 대한 우선순위와 서비스 종류 등을 제어합니다.
Total Length(16bits)는 IP헤더와 실재 데이터의 크기를 합친 길이, Byte 단위입니다.
Identification(16bits)은 단편화 된 데이터 그램을 구분할 수 있는 일련번호입니다.
Flags(3bits)은 데이터 그램의 단편화에 대한 정보를 알려주기 위해 사용합니다. 첫 번째 비트 0, 두 번째 비트(DF) 0(단편화된 데이터)/1(단편화 되지 않음) 세 번째 비트(MF) 0(마지막 단편화 데이터)/1(단편화된 데이터가 더 있음)를 나타냅니다.
Fragment Offset(13bits)은 단편화된 데이터 그램이 원래 데이터 그램의 몇 번 째 위치부터 단편화 되었는지를 알려 줍니다.
Time To Live(8bits)는 데이터 그램이 지날 수 있는 라우터의 수에 대한 생존시간를 나타냅니다.
Protocol(8bits)은 IP 데이터 그램의 사용자 데이터에 입력된 상위 계층 프로토콜(TCP, UDP, ICMP등)를 나타냅니다.
Header Checksum(16bits)은 IP헤더의 손상여부를 파악합니다.
Source Address(32bits)는 발신지 IP 주소를 나타냅니다.
Destination Address(32bits)는 목적지 IP 주소 를 나타냅니다.


다음으로 TCP 헤더구조에 대해 알아보겠습니다.

Source Port(16bits)는 발신지 port (약 65536 포트)를 나타냅니다.
Destination Port(16bits)는 목적지 port (약 65536 포트)를 나타냅니다.
Sequence Number(32bits)는 TCP 세그먼트(TCP데이터 단위) 안의 데이터의 송신 바이트 흐름의 위치, 데이터 스트림의 순서, 중복된 세그먼트 구분, 데이터 수신 확인 등의 기능을 담당합니다.
Acknowledgment Number(32bits)는 수신측에서 송신측으로부터 받은 세그먼트에 대한 응답합니다.
HLEN(4bits)은 TCP 세그먼트의 길이입니다.
Reserved(6bits)는 나중을 위해서 예약된 필드입니다.
Code Bits(6bits)는 TCP세그먼트의 용도와 내용을 결정하기 위해서 사용합니다.
Window Size(16bits)는 수신자의 입장에서 현재 자신의 가용 버퍼크기를 나타냅니다.
Checksum(16bits)은 TCP 세그먼트 데이터가 훼손/변조되었는지를 체크합니다.
Urgent pointer(16bits)는 긴급 메시지 전송. 긴급 메시지는 별도의 패킷이 아닌, 일반 데이터에 포함되어 전달합니다.

 

실제 TCP 연결은 어떻게 이루어지는지 살펴보도록 하겠습니다.

연결과정은 매우 간단합니다.
1) 서버는 LISTEN인 상태에서 클라이언트가 서버에게 SYN(연결신호)를 보내고 클라이언트는 SYN_SENT 상태가 됩니다.

2) 서버가 클라이언트로 부터 SYN을 받으면 SYN_RECEIVE 상태가 되고, 그에 대한 SYN과 ACK 를 보낸다.

3) 클라이언트는 서버로 부터 SYN과 ACK를 받고, 서버에게 ACK 를 보내면 ESTABLISHED 상태가 된다.

 

TCP 연결 예제입니다. 

웹 브라우저(HTTP1.0)에서 http://www.tmax.co.kr 호출했을 때, 정상적인 TCP 연결과정을 설명합니다.

Ethernet헤더에서는 Destination Mac 정보, Source Mac 정보, 이더넷 Type을 담고 있습니다.
IP헤더에서는 IPv4 버전, Total Length, Identification, Protocol, Checksum, Source IP, Destination IP를 담고 있습니다.
TCP헤더에는 실제 데이터가 담겨 있습니다.
Source Port, Destination Port, Sequence Number, Ack, Syn packet이 담겨 있습니다.

위와 같이 Hex 값으로 변환 된 값들을 보면 TCP / IP 정보들을 볼수 있습니다. 다만, 눈으로 수많은 정보들을 다 보기에는 한계가 있을 것입니다. 그래서 패킷 분석 프로그램이 필요한것이고 본인 포스팅 중 Wireshark 포스팅을 보시면 이해가 되실겁니다.


다음으로 TCP 연결 종료과정을 설명합니다. 

1) 연결을 종료하고자 하는 송신자가 컨넥션을 close하면서 수신자에게 FIN(종료신호)를 보내고 송신자는 FIN_WAIT_1 상태가 된다. (손신자는 SEND는 사용할 수 없고, RECEIVE 만 가능하다)
2) 수신자는 송신자로 부터 FIN을 받으면 CLOSE_WAIT 상태가 되고, 그에 대한 ACK를 보낸다.
3) 송신자는 수신자로 부터 ACK를 받으면 FIN_WAIT_2 상태가 된다.
4) 수신자는 컨넥션을 close하면서 송신자에게 FIN을 보내고, 이에 대해 송신자는 수신자에게 ACK를 보내고 TIME_WAIT 상태가 된다.  


마지막으로 TCP 연결 종료 관련 TCP Parameter입니다.

FIN_WAIT_2는 세션종료를 요청한 이후, Remote에서 세션종료를 하지 않는 경우 세션종료를 요청한 측에서 FIN_WAIT_2 상태로 남아 있게 됩니다.
TIME_WAIT는 세션종료를 먼저 시작한 쪽에 남게 되며, 연결 종료 시 마지막 패킷 전송 실패를 대비하기 위한 상태입니다.
FIN_WAIT_2, TIME_WAIT 상태가 늘어날 경우, 할당 가능한 PORT를 모두 소비하여 연결을 할 수 없게 됩니다.

 

TCP/IP에 대한 개념 정리는 매우 중요한 일환 중 하나입니다. 때때로 발생될 수 있는 TCP Socket 낭비를 해결하기 위한 OS Parameter 튜닝이나, IP의 분기 조건 등을 통해 성능을 개선할 수 있기도 하며, Failover를 수행하는데 있어 사이트의 특성을 적절히 반영할 수 있기 때문입니다.

또한 불필요한 Packet 낭비를 막고 이를 반영할 수 있다면 여러분은 이미 전문가입니다.

그럼 이번 포스팅은 여기서 마치도록 하겠습니다.

고맙습니다.

 

728x90
반응형