티스토리 뷰

  다음으로 TCP/IP의 Transport층에 대해 알아보자. TCP/IP에서의 Network Access와 인터넷 계층이 OSI 7계층에서의 물리, 데이터링크, 네트워크 계층과 조금 다른 데에 반해 전송층은 TCP/IP에서나 OSI에서나 역할이 거의 같다. 전송층의 가장 중요한 역할은 응용프로그램 간의 (논리적인) 통신을 구현하는 것이다. 따라서 컴퓨터의 수많은 프로그램 중에 정확하게 어떤 프로그램과 통신할지 식별하기 위해 '포트번호'를 사용한다.

 

  Transport층에서 대표적으로 사용되는 프로토콜은 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)이다. TCP는 connection형(연결지향적)이고 신뢰성이 보장된다. 양 단 간 커넥션을 맺고 패킷이 유실되거나 순서가 바뀌는 등의 문제가 생기면 TCP가 해결한다. 또한 대역폭과 혼잡을 제어할 수 있다. 하지만 커넥션을 확립하고 끊는 데에만 패킷을 여러번 주고받기 때문에(3-way handshaking) 전송할 데이터 총량이 적은 경우에는 효율이 떨어진다.

 

  UDP는 TCP와 반대로 신뢰성 없는 connection-less형 프로토콜로, 커넥션과 데이터 전송에 대한 보장이 없다. 즉, 상대방이 네트워크에 있는지, 상대방에게 패킷이 잘 도착했는지 등을 확인하지 않는 대신, 필요하다면 해당 기능을 응용프로그램이 수행한다. 사용은 간단하지만 그만큼 접속이 끊어지거나 에러가 많이 생기기 때문에 주로 인터넷 방송, 게임 등 멀티미디어 전송에 쓰인다.

 

  학교 다닐 때 TCP와 UDP를 배우면서 와이어샤크로 과제를 했던 게 생각났다. 무선랜에서 P2P, 메신저를 사용했을 때 오가는 패킷을 Wireshark로 캡처하고 분석하는 과제였는데, 다시 하려니까 귀찮아서 퍼왔다.

 

 

[그림1. 네이트온 쪽지를 주고 받을 때의 IP헤더]

 

[그림2. IP헤더 내용 분석]

 

  IP헤더의 Protocol이 00000110으로 6임을 알 수 있다. 프로토콜 6번은 TCP이므로, 다음 헤더의 프로토콜이 TCP임을 알 수 있다.

  * 참고: IP헤더의 구조 관련 포스팅 - [TCP/IP] 3. 인터넷 계층의 모든 것(1): IP프로토콜, IP패킷, IP헤더의 구조

 

 

[그림3. 네이트온 쪽지를 주고 받을 때의 TCP헤더]

 

[그림4. TCP헤더 내용 분석]

 

  전송층의 프로토콜이 TCP일 때 헤더 구조는 그림4와 같다. 송수신처 포트번호와 시퀀스 번호, ACK 번호 등으로 구성된다. 시퀀스 번호는 송신한 데이터의 위치를 의미하는데, 데이터를 송신할 때마다 송신한 데이터의 바이트 수만큼 값이 증가한다. 이 값은 커넥션을 처음 확립할 때 랜덤하게 설정되고, SYN 패킷으로 수신host에 전달되며, 전송한 바이트 수를 초기값에 더해 위치를 나타낸다. (커넥션을 확립할 때의 SYN 패킷과 끊을 때의 FIN 패킷은 데이터를 포함하지 않지만 1byte로 친다.)

 

  ACK는 우리말로 확인응답번호라고 할 수 있는데, 다음으로 수신할 데이터의 시퀀스 번호이다. 따라서 이전에 받은 시퀀스 번호에 1을 더한 값이다. 송신측에서는 이 ACK 값을 보고 그 바로 전 데이터까지 정상적으로 받았다는 걸 확인한다.

 

  Data Offset은 4-byte 단위로 실제 운반할 데이터가 패킷의 어느 지점부터 시작하는지를 나타낸다. 즉, TCP헤더의 길이로 봐도 무방하다. 여기서는 이 값이 8이므로 32bytes가 TCP헤더 길이다.

 

  Reserved 필드는 확장을 위해 예약된 4bits 길이 필드이다.

 

  Control 필드는 총 8개 bit에 순서대로 CWR, ECE, URG, ACK, PSH, RST, SYN, FIN 값으로 이를 '제어비트'라고도 한다. 각 비트에 1을 지정하여 TCP 회선과 데이터를 관리할 수 있다. 예를 들어 RST(Reset Flag)가 1인 경우, 커넥션이 강제적으로 끊어진다. 사용하지 않는 TCP 포트번호로 연결요청이 왔을 때 RST에 1을 설정한 패킷을 반송함으로써 연결을 끊게 된다. 프로그램이 다운되거나 pc 전원이 나갔을 때도 RST를 통해 커넥션을 모두 초기화하여 통신을 끊게 된다. SYN(Synchronize Falg)는 커넥션 확립에 사용된다. 이 경우에도 SYN 값이 1인데, 커넥션을 확립하려는 의사를 나타냄과 동시에 시퀀스 번호 필드에 저장된 번호로 시퀀스 번호를 초기화 시킨다.(동기화라는 건 바로 이 시퀀스 번호를 일치화시키는 과정을 말함) 커넥션을 맺고 더이상 송신할 데이터가 없을 땐 FIN 값을 1로 설정하여 커넥션을 끊자고 한다. 양쪽 host가 FIN을 1로 설정한 TCP 세그먼트를 서로 교환하게 되면 그에 대한 확인응답과 함께 커넥션을 끊게 된다.(당연히 자기가 보낼 데이터는 다 보낸 후에 응답을 보내겠지?)

 

  Window size는 버퍼용량을 뜻하는데 이 값을 통해 Flow control이 이루어진다. Checksum에 따라 데이터 오류가 검출되면 패킷 재전송을 요구한다. Urgent Pointer(긴급 포인터)는 컨트롤 플래그의 IRG가 1인 경우 유효하다. 이 값은 긴급하게 사용할 데이터의 저장장소를 가리키는 포인터이다.(byte 단위) 이 긴급데이터를 어떻게 다룰 것인지는 응용프로그램이 결정한다. 일반적으로는 통신을 도중에 중단시킬 때 사용하는데, 웹 브라우저에서 중지버튼을 입력하거나 Telnet 세션에서 컨트롤+C를 입력하는 경우가 이에 해당한다. 이 밖에도 옵션/패딩까지가 TCP 헤더에 포함된다.

 

 

[그림5. 토렌트를 사용할 때 UDP헤더]

 

[그림6. UDP헤더 내용 분석]

 

 

  토렌트를 사용할 때 패킷을 분석해보았다. 물론 IP헤더에서 프로토콜 필드 값이 00010001로 17(UDP)이었다. UDP는 그 특징만큼 헤더 구조도 간단하다. 송수신 포트번호, 헤더길이, Checksum으로 이루어져있다. UDP헤더는 체크섬을 사용하지 않을 경우 해당 필드에 '0'의 값을 넣으면 된다. 체크섬을 사용하지 않으면, 오버헤드가 줄고 데이터 전송속도가 빨라지지만 포트번호나 IP주소값이 손상되면 다른 통신에 영향을 줄 수 있으므로 현재 인터넷에서는 체크섬을 사용할 것을 권장한다.(TCP의 checksum도 UDP와 동일하지만 해당 기능을 OFF할 수는 없다.)

 

  참고로 UDP에서는 이 Checksum을 계산하기 위해 UDP헤더가 아닌 'UDP 유사헤더'를 사용한다. UDP 헤더정보 외에 IP헤더로부터 송수신처 IP주소를 따와 유사헤더를 작성하여 checksum을 재계산한다. 왜냐하면 TCP/IP에서는 통신할 host와 응용프로그램까지 식별하기 위해 송수신처 IP주소, 포트번호, 그리고 프로토콜이 필요한데 UDP헤더에는 송수신처 포트번호 밖에 포함되지 않기 때문에 UDP헤더만 가지고 checksum을 계산하면, 나머지 세 정보가 손상되면 데이터가 다른 어플리케이션에 잘못 전달될 수 있다. 따라서 이 다섯가지 정보를 모두 포함한 유사헤더를 사용한다. 특히 IPv6에서는 IP헤더에 checksum이 없기 때문에 TCP/DUP에서 유사헤더를 통해 IP헤더 대신 신뢰성을 보장해주게 된다.

 

 

 

[그림7. TCP/UDP의 포트목록 - 출처: 위키백과]


 

  다음으로 전송층에서 사용되는 포트번호에 대해 알아보도록 하자.

 

  포트번호는 동일한 컴퓨터 안에서 통신하고 있는 프로그램을 식별하기 위해 사용되며, 전송층 프로토콜별로 그 처리가 일어나기 때문에 다른 프로토콜끼리 동일한 포트번호를 사용할 수 있다. 예를 들면, DNS에 사용되는 포트번호 53번은 TCP와 UDP 모두에서 이용된다. 포트번호별로 사용목적은 정해져있다. http, telnet, ftp와 같이 널리 사용되는 어플리케이션 프로토콜에는 사용할 포트번호가 정해져있는데 이를 'Well-known port number'라 하고, 0부터 1,023까지 할당되어 있다. 이 외에도 1,024부터 49,151까지는 정식으로 등록된 포트번호가 있는데, 이 번호는 다른 용도로 사용해도 무방하다. 49,152부터 65,535까지는 Dynamic포트로 자유롭게 할당(주로 클라이언트에서)한다. 잘 알려진 포트번호와 등록된 포트번호에 대해서는 이 사이트에서 확인할 수 있다.

 

 

  오늘은 TCP와 UDP에 대해 간단히 알아보았다. 간만에 글을 쓰려니 넘 피곤하고 귀찮아서 적당히 찾아 적었다. ㅠㅠ.. 부디 담주부터는 열공하는 걸로..!!



[지난 글 보기]

[TCP/IP] 1. 네트워크 접근 계층, 그리고 데이터링크층과 MTU

[TCP/IP] 2. 가장 널리 보급된 데이터링크인 이더넷, 1000BASE-T의 의미는?

[TCP/IP] 3. 인터넷 계층의 모든 것(1): IP프로토콜, IP패킷, IP헤더의 구조

[TCP/IP] 4. 인터넷 계층의 모든 것(2): IP주소, CIDR/VLSM, NAT

댓글