YUDA't

물리 계층, 데이터링크 계층, 네트워크 계층, 이 세 계층이 있으면 목적지까지 데이터를 보낼 순 있지만 데이터의 손상/유실은 보장해주지 않는다. 그래서 전송 계층이 필요하다. 전송 계층은 1) 오류가 발생하면 데이터를 재전송하도록 요청하고 2) 전송된 데이터의 목적지가 어떤 애플리케이션인지 식별함으로써 목적지까지 신뢰할 수 있는 데이터를 전달한다.

 

다중화와 역다중화

전송 계층은 다중화(multiplex)역다중화(demultiplex) 기능을 가지고 있다. 다중화는 소켓들로부터 데이터를 모으고, 세그먼트 생성을 위한 헤더 정보를 기반으로 이들을 캡슐화하여 네트워크 계층으로 보내는 것이다. 역다중화는 전송 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 것이다.

전송 계층은 포트(port)를 통해 이러한 작업을 수행한다. 16비트로 이루어진 포트는 특정 어플리케이션으로 트래픽을 유도하는 데 사용된다. 즉 각각의 포트에서 각기 다른 네트워크 서비스가 돌아간다.

예를 들어 우리가 10.1.1.100 IP로 돌아가는 웹서버에 웹페이지를 요청한다면 트래픽은 해당 컴퓨터의 80번 포트로 전달될 것이다(HTTP의 포트는 80). 일반적으로 포트는 127.0.0.1:8000과 같이 IP 주소 다음에 콜론(:)으로 표시된다. 이를 소켓 주소 혹은 소켓 번호라고 한다.

다른 예로는 FTP(File Transfer Protocol)가 있다. FTP는 한 컴퓨터에서 다른 컴퓨터로 파일을 전송될 때 사용되는 프로토콜이며 21번 포트를 사용한다.

 

TCP 세그먼트(segment)

이더넷 프레임이 IP 데이터그램을 캡슐화했던 것처럼, IP 데이터그램은 TCP 세그먼트를 캡슐화한다. 그리고 이더넷 프레임의 페이로드(payload)가 IP 데이터그램인 것처럼 IP 데이터그램의 페이로드는 TCP 세그먼트이다. (참고로 이 TCP 세그먼트 또한 응용 계층의 페이로드)

TCP 세그먼트의 헤더는 다음과 같이 많은 필드로 이루어져 있는데, 하나씩 살펴보겠다.

출발지 포트(Source port) & 목적지 포트(Destination port)

출발지 포트는 특정 영역의 포트로부터 선택된 임시 포트이며, 목적지 포트는 트래픽이 향해야 할 포트이다.

 

일련 번호(Sequence number)와 확인응답 번호(Acknowledgment number)

데이터가 제한된 크기를 넘으면 TCP는 이를 여러 세그먼트로 나눈다. 이때 세그먼트의 순서가 적힌 일련 번호는 그 다음 세그먼트를 추적할 수 있도록 돕는다.

확인응답 번호는 해당 세그먼트 다음에 올 것으로 예상되는 일련 번호이다. 간단히 말해 일련 번호가 1이라면 확인응답 번호는 2일 것이다.

 

데이터 오프셋(Data offset)

해당 세그먼트의 TCP 헤더 길이를 알려주는 필드이다. 데이터 오프셋이라는 명칭은 이것이 실제 데이터 상에서의 TCP 세그먼트의 시작 위치의 오프셋이기 때문에 붙여졌다.

 

연결 제어(Control flags)

연결 제어 필드는 총 6개이고 각 1비트씩이다. 초깃값은 0이며 비트가 활성화되면 1이 된다. 전송 계층에서 데이터를 전송하려면 일단 가상회선 연결을 확보해야 하는데 이때 연결 제어 필드가 사용된다.

아래와 같이 연결이 성립되기 위한 과정을 3-way handshake라 하는데, 과정을 설명하자면 이렇다.

1) 클라이언트는 연결 확립 허가를 받기 위한 SYN(synchronize; 연결 요청)을 서버에 보낸다.

2) 서버는 SYN을 받은 후, 통신을 허가한다는 ACK(acknowledges; 확인 응답)을 클라이언트에 보낸다. 이와 동시에 서버도 클라이언트에 SYN을 보낸다.

3) 클라이언트는 서버에게 ACK를 보낸다.

이렇게 데이터를 전송한 뒤에는 연결을 끊기 위해 연결 해제 과정(4-way handshake)을 거치는데, 여기서 FIN(finish)ACK이 사용된다.

 

윈도우 크기(Window)

세그먼트를 하나 보낼 때마다 확인 응답을 하면 효율이 낮으므로, 세그먼트를 연속해서 보내고 난 뒤 확인 응답을 반환한다. 이때 세그먼트가 쌓이는 장소를 버퍼(buffer)라고 한다. 그러나 세그먼트를 대량으로 받아 처리하지 못하는 경우, 데이터가 보관되지 못하고 넘쳐 버리는데 이를 오버플로(overflow)라 한다. 그래서 오버플로가 발생하지 않도록 윈도우 필드에 버퍼의 한계 크기를 기록해둔다. 이는 송신 컴퓨터가 수신하고자 하는 일련 번호의 범위로, 확인응답 번호보다 큰 값이어야 한다.

 

체크섬(Checksum)

헤더 및 데이터의 오류를 잡아낸다.

 

긴급 포인터(Urgent pointer)

연결 제어 필드 중 URG 플래그가 설정된 경우, 특정 세그먼트가 다른 세그먼트보다 중요함을 나타내기 위해 사용된다. 현재는 쓰이지 않는다.

 

옵션(Options)

긴급 포인터 필드처럼 실제로는 거의 사용되지 않는 필드지만 좀더 복잡한 제어 프로토콜에서 가끔 쓰인다.

 

패딩(Padding)

0으로 이루어져 있는 필드로, 데이터 페이로드가 예상 지점에서 시작되는지 확인한다.

 


 

UDP(User Datagram Protocol)

UDP의 헤더는 다음과 같이 매우 간단하다.

TCP가 3-way handshake로 연결이 확립된 상태에서 통신했다면, UDP는 비연결형 통신으로 데이터를 받을 준비를 하는 확인작업을 거치지 않는다. 그래서 TCP보다 빠르고 오버헤드가 적지만 수신자가 메시지를 수신했는지 알 수 없으며 메시지 도착 순서 또한 예측할 수 없다.

한편 UDP를 사용하면 연결확인 작업이 필요하지 않기 때문에 같은 랜에 있는 컴퓨터나 네트워크 장비에 브로드캐스트(broadcast)를 할 수 있다.