네트워크

[TCP/IP stack] stack_4. 전송 계층 : Port, UDP, TCP

Ardmos :) 2021. 12. 6. 16:00

네트워크 계층까지가 네트워크상의 특정 기기까지 어떻게 찾아가느냐의 문제였다면 

전송 계층은 호스트상에 구동중인 프로세스들 중 특정 프로세스를 찾아가는 방법의 구현을 담당한다.

이때 사용되는 핵심 개념이 '포트'이고 많이 들어봤을 UDP와 TCP가 바로 전송 계층의 핵심 프로토콜이다. 

 

 

- Port

 

  1. 포트는 16비트의 부호 없는 숫자로서 특정 호스트의 통신 종단점을 나타낸다. ( 프로세스를 특정하는데 쓰인다는 뜻이다 )

 

  2. 이론상 프로세스는 어떤 포트든 자신과 바인딩하여 사용할 수 있다.

 

  3. 하지만 다른 두 프로세스가 같은 포트에 바인딩하게되는경우 해당 포트를 찾아온 데이터를 어느 프로세스에 전달해야하는지 난해해지는 문제가 발생하기 때문에 대부분의 운영체제에서는 같은 포트에 바인딩하려 할 때 특별한 플래그를 설정해야만 이를 허용한다. 

 

  4. 이런 포트를 둘러싼 혼선을 방지하고자 IANA(Internet Assigned Numbers Authority) 산하 ICANN(Internet Corporation for Assigned Names and Numbers) 에 개발자가 각자 필요로하는 포트를 등록하여 사용하길 권장한다. 

이곳에서 포트 번호 1024부터 49151까지는 user port 또는 registered port 라 하여 개발자들은 IANA에 이 범위 내의 포트 번호를 요청할 수 있다. 

 

  5. 포트 번호 0번부터 1023까지는 system port 또는 reserverd port 라고 한다. 특별한 포트들로 

이 역시 IANA에 등록되어 있는데, 일반적으로 오직 루트 레벨의 프로세스들만 바인딩이 가능한 포트들이다.( 접근 권한이 까다롭다 )

 

  6. 나머지 49152 ~ 65535 까지의 포트는 dynamic port로 IANA의 관할 밖이며 자유롭게 사용이 가능하다.

 

 

- UDP

 

  1. 헤더 길이가 8바이트밖에 되지 않는 경량 프로토콜이다. 

 

  2. 발신지 포트, 목적지 포트, 길이, 체크섬 만 입력하면 된다. 

 

  3. 2번의 내용으로 헤더를 구성하고 뒷부분에 페이로드를 붙인 뒤 전송하면 되는데, 목적지에 전달되는 순서를 보장해주지도 않고 전달 자체를 보장해주지도 않는다.

( 발신된 데이터가 목적지까지 가는동안 생기는 모종의 이유로 나중에 보낸 데이터가 먼저 도착하는 경우가 발생하는 경우들이 있는데 UDP의 경우 이를 대비한 메커니즘이 없다. 물론 도착을 아예 못한 경우에도 마찬가지. )

 

 

- TCP

 

  1. 양쪽 호스트 사이에 연결을 계속 유지한 채로 데이터 스트림을 주고받는다. 

 

  2. 신뢰성 확보 : 패킷의 ACK 필드값에 다음으로 받아야할 시퀸스 넘버를 적어서 전송하는 방식으로 다음에 받아야할 데이터를 확인하고, 이를 통해 데이터 전달의 신뢰성을 확보한다.

 

  3. 데이터의 순서 보장 : 마찬가지로 시퀸스넘버를 사용해 데이터의 순서도 확인해서 처리해준다. (이 때 발신자는 마지막 세그먼트의 시퀸스 넘버로 ACK값을 받으면 '아 이전에 세그먼트들은 모두 잘 도착했구나' 라고 생각한다. 따라서 마지막 ACK만 받으면 이전의 내용을 다시 보낼 필요가 없다. )

 

  4. 흐름 제어 : 수신측에서 처리가능한 속도를 초과하는 양의 데이터가 밀려드는 상황을 막기 위한 기법이다. 수신측에서 TCP 헤더에 수신 버퍼의 여유량을 기재해서 상대 호스트가 수신 버퍼의 여유량을 감안하여 데이터를 보낼 수 있도록 한다. 

 

  5. 혼잡 제어_속도 제어 방식 : 중간에 네트워크나 라우터가 느린 부분에서 과부하가 발생하는 상황을 예방하기 위해 사용되는 기법으로, 송신자가 자체적으로 패킷의 확인응답률 및 누락률을 집계해서 데이터가 누락되지 않으면서 최대한 빠른, 적당한 빠르기로 패킷을 전송한다. 

 

  6. 혼잡 제어_패킷 크기 제어 방식 :  네이글 알고리즘을 적용해 데이터를 최대한 쌓아두었다가, 쌓인 양이 한계치를 넘어서면 세그먼트로 만들어 보내는 식으로 패킷의 크기를 최대 세그먼트 길이에 가능한 한 가깝게 맞추어 보내서 네트워크의 혼잡을 줄이는 방식이다. 이렇게 세그먼트의 개수를 줄이게되면 줄인 개수만큼 반복됐을 헤더들의 양을 줄이게되어 네트워크의 대역폭을 절약할 수가 있다. 

 

  7. 이더넷의 MTU가 1,500 바이트, IPv4를 사용할경우 IPv4의 헤더가 20바이트, 그리고 TCP의 헤더가 20바이트이니 TCP 세그먼트 하나에 실어보낼 수 있는 데이터는 1,460바이트가 된다. 이 숫자를 MSS(maximum segment size)라고 한다.

 

  8. 연결을 종료할 때 FIN 패킷을 주고받아 데이터 전송이 끝났다는걸 알리고 종료한다. 

 

 

 

728x90