6.1. 전송 계층
전송계층은 서로 다른 호스트에서 동작하는 응용계층 프로세스들 간의 논리적 통신을 제공합니다.
하위 계층인 네트워크계층은 비 신뢰적 데이터 전송(패킷 분실 또는 손상)을 하지만,
상위 계층인 응용계층에게 신뢰적 데이터 전송 서비스를 제공합니다.
하위계층인 네트워크 계층의 IP프로토콜은 최선형(Best-effort) 전달 서비스를 제공하지만,
이는 최선책일 뿐 순서 전달 보장이나 무결성 보장은 되지 않습니다. ( 즉, IP는 비신뢰적 서비스입니다. )
전송계층에는 대표적으로 TCP와 UDP가 있습니다.
TCP와 UDP는 헤더에 오류 검출 필드를 추가함으로써 무결성 검사를 제공합니다.
전송계층과 응용계층 프로세스간의 인터페이스( 요청 창구 ) 를 “소켓”(Socket)이라고 표현합니다.
하나의 프로세스에 대해 보통 하나의 소켓으로 연결하지만,
스레드를 생성하여 동시에 여러 소켓을 연결시킬 수도 있습니다.
이 때, 여러 소켓들을 하나로 모아서 헤더를 부착하고 세그먼트로 만들어 하위 계층으로 넘기는 작업을
“다중화”(Multiplexing)라고 표현합니다.
의도는 여러소켓이 결국 같은 하위 계층을 사용하게 되는데 불필요한 비용을 줄이기 위해
한꺼번에 세그먼트화 하여 넘기는 과정입니다.
역으로, 수신 된 세그먼트 내 데이터를 목적지 호스트의 여러 소켓 중 데이터에 부합 한 소켓으로 전달하는 작업을
“역다중화”(Demultiplexing)라고 표현합니다.
의도는 다중화 된 세그먼트는 사용가능 상태가 아니므로 분할 및 분류를 하여
다시 식별가능한 소켓으로 만드는 과정입니다.
“UDP소켓”은 목적지 IP주소와 목적지 Port 번호로 식별하여 전달작업을 거칩니다. ( 출발지는 고려하지 않습니다. )
“TCP소켓”은 출발지 IP주소와 출발지 Port 번호, 목적지 IP주소와 목적지 Port 번호로 식별하여 전달작업을 거칩니다.
“포트”(Port)는 특정 프로토콜이나 그 해당되는 서비스를 식별하기 위해 사용되는 번호 입니다.
포트는 0 부터 65535까지 존재하며,
0 ~ 1023 은 “Well-Known Port”로 불리고, 특정 프로토콜과 서비스가 예약된 구간입니다.
(대표적으로 20,21 는 FTP , 22 는 SSH , 23 은 Telnet , 25 는 SMTP , 53 은 DNS , 80 은 HTTP , 443 은 HTTPS )
1024 ~ 49151 은 “Registered Port”로 불립니다.
49152 ~ 65535 는 “Dynamic Port”로 불립니다.
6.2. UDP
“UDP”(User Datagram Protocol) 은 전송계층 프로토콜이 할 수 있는 최소기능으로 동작합니다.
다중화와 역다중화를 지원합니다. 간단한 오류검사( 체크섬 )기능을 지원합니다.
연결설정이 없어 관련된 지연이 발생하지 않습니다. 연결상태도 없어 유지관리 할 자원이 적습니다.
또한, 오버헤드가 적어 같은 버퍼에 더 많은 데이터를 보낼 수 있습니다. UDP는 TCP보다 빠르기 때문에,
정교한 제어나 즉각적인 피드백을 받는 통신에 대해서는 뛰어나다고 볼 수 있습니다.
(예를 들어, 원격데스크톱의 경우 마우스의 움직임이 즉각적으로 전달받기 위해서는 UDP를 사용합니다. )
하지만, UDP는 TCP보다 속도나 전달량은 뛰어나지만, 정확성이나 검증부분에서는 떨어지기 때문에,
비신뢰적 데이터 전송에 속합니다.
UDP 세그먼트는 다음과 같이 구성되어 있습니다.
16비트 | 16비트 |
---|---|
출발지 포트번호 | 목적지 포트번호 |
길이 | 체크섬 |
1). 출발지 포트번호와 목적지 포트번호는 송수신측 간에 사용하는 프로세스가 쓰는 포트번호입니다.
( 크기는 둘 다 16bit = 2Byte )
2). 길이는 UDP 헤더와 UDP data를 더한 총 크기입니다.
( 크기는 16bit = 2Byte )
3). 체크섬은 비트오류를 검출하기 위한 장치로
Pseudo Header 의 필드를 16비트 단위로 모듈러 덧셈( 덧셈 후 모듈러를 거침 ) 후 1의 보수한 결과입니다.
( 크기는 16bit = 2Byte )
체크섬을 확인 할 때 역시 Pseudo Header 의 값을 더하고 모듈러 덧셈 후 1의 보수하여 같은지 확인합니다.
4). 헤더 이후에는 UDP data가 있습니다.
Pseudo Header는 다음과 같이 구성되어 있습니다.
8비트 | 8비트 | 16비트 | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
출발지 IP 주소 | |||||||||||||||||||||||||||||||
목적지 IP 주소 | |||||||||||||||||||||||||||||||
0x00 | 프로토콜 | UDP 길이 |
(이후에 나올 TCP에도 동일하게 체크섬을 사용하고 UDP와 동일한 Pseudo Header와 동일한 계산법으로 계산합니다.)
6.3. TCP 세그먼트 구조
“TCP”(Transmission Control Protocol) 은 하위 계층이 비신뢰적 데이터 전송을 수행하지만,
상위 계층에게 완전히 신뢰적인 데이터 전송을 보장하는 프로토콜입니다.
TCP 세그먼트는 다음과 같이 구성되어 있습니다.
7비트 | 9비트 | 16비트 | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
출발지 포트번호 | 목적지 포트번호 | ||||||||||||||||||||||||||||||
순서번호 | |||||||||||||||||||||||||||||||
확인응답번호 | |||||||||||||||||||||||||||||||
헤더길이 | 예약필드 | 다양한 플래그들 각 1비트씩 좌측 부터 NS, CWR, ECE, URG, ACK, PSH, RST, SYN, FIN | 수신 윈도우 크기 | ||||||||||||||||||||||||||||
체크섬 | 긴급데이터포인터 | ||||||||||||||||||||||||||||||
옵션(zero패딩) |
각 정보들의 의미는 다음과 같습니다.
( 자세한 내용은 뒤에 언급하기에 “이것은 이러한 용도이다” 정도만 이해하셔도 무방합니다. )
1). TCP는 데이터를 순서가 있는 값의 흐름으로 해석합니다.
2). 출발지 포트번호와 목적지 포트번호는 송수신측 간에 사용하는 응용 프로세스가 쓰는 포트번호입니다.
( 크기는 둘 다 16bit = 2Byte )
3). 순서번호는 세그먼트를 MSS 단위로 분할해야 할 때, 순서가 있는 값의 흐름을 끊지 않고 전달하기 위해
끊는 순간의 총 데이터 전송량을 구하여 다음 데이터 전송 순번을 총 전송량 + 1로 정하고 순서번호에 기입합니다.
( 크기는 32bit = 4Byte )
4). 확인응답번호는 수신측에서 발신측으로 부터 원하는 순서의 데이터를 얻기 위하여
다음 받아야 할 순서번호(즉, 요청 순서번호)를 기입하여 응답합니다.
( 크기는 32bit = 4Byte )
5). 헤더길이는 해당 TCP의 헤더길이(헤더 범위)를 저장합니다. TCP헤더크기는 20byte에서 60byte까지 가능합니다.
( 크기는 4bit 인데 0b0101이 20byte ~ 0b1111이 60byte로 0b0001당 4byte로 매핑 되어있습니다. )
6). 예약필드는 아직 규정 상 지정되지 않은 공간으로 0으로 채워져 있어야 합니다. 미래에 필요하에 사용될 것입니다.
( 크기는 3bit )
7). 수신 윈도우 크기는 세그먼트의 수신측의 가용 버퍼 크기를 발신측에게 알리기 위해 사용합니다.
해당 개념은 흐름제어를 위해 필요한 것이므로 아래에 흐름제어 파트를 참고 해주시기 바랍니다.
( 크기는 16bit = 2Byte )
8). 체크섬은 UDP와 마찬가지로 비트오류를 검출하기 위한 장치입니다.
( 크기는 16bit = 2Byte )
9). 긴급 데이터 포인터는 해당 패킷이 긴급 데이터로 동작할 때,
순서번호와 해당 포인터 값을 더한 주소가 긴급 데이터의 끝 지점의 주소라는 의미로 사용합니다.
오늘날 TCP 통신에는 URG와 긴급 데이터 포인터를 사용하지는 않습니다.
( 자세한 내용은 아래의 내용을 참고 해주시기 바랍니다. )
( 크기는 16bit = 2Byte )
10). 옵션(zero패딩)은 추가적인 내용을 담는 동적 공간으로
예를 들어 MSS나 Window Scale 등의 정보들이 추가 될 수 있습니다.
( 크기는 동적으로 0bit에서 40Byte까지 가능합니다. )
11). 헤더 이후에는 TCP data가 있습니다.
다음은 1비트씩 사용되는 다양한 플래그 9가지에 대한 설명입니다.
순서는 좌측부터 1비트씩 해당 되는 플래그를 나열 하였습니다.
1). NS는 Nonce Sum으로 TCP의 체크섬처럼, 프로토콜(ECN)을 사용할 때 nonce에 대한 검사 비트를 추가하여
비트 손상 및 위조 여부를 검사하기 위해 사용합니다. ( 1 비트이기 때문에 정밀도(Precision)는 50%정도 입니다. )
( ECN은 IP프로토콜에서 사용될 예정입니다. )
2). CWR은 Congestion Window Reduced로 발신측이 수신측에게 ECE 플래그를 받았다고 응답하기 위해 사용합니다.
이는 혼잡제어를 받아 들인다는 의미이고 해당 내용을 수신측에게 알리기 위해 사용됩니다.
3). ECE는 Echo of Congestion Encountered로 현재 패킷이 손실되고 있음(CE, Congestion Encountered 가 되었음)을
수신측이 감지하여 발신측에게 알리기 위해 사용합니다.
4). URG는 URGent로 긴급 데이터 포인터와 같이 사용됩니다.
사용용도는 긴급한 데이터임을 알리고 해당 패킷을 즉시 처리해야 한다는 신호로 해당 플래그가 사용됩니다.
오늘날 TCP 통신에는 URG와 긴급 데이터 포인터를 사용하지는 않습니다. ( 자세한 내용은 아래 참조 )
5). ACK는 ACKnowledgement로 확인응답번호와 함께 응답을 하기 위한 신호로 해당 플래그가 사용됩니다.
해당 플래그가 활성화 되면 해당 패킷은 응답신호로 사용된다는 의미이고
즉, 확인응답번호의 값이 유효하다는 의미입니다.
6). PSH는 PuSH로 보통의 TCP는 MSS에 가깝게 데이터들을 모으고 보내는 특성을 가지는데 이는 효율적이지만,
때로는 소량의 데이터들을 즉각 즉각 보내야하는 경우도 존재 할 것입니다. ( 반응형 응용 프로세스 등 )
이때, 기다리지 않고 즉시 상위 계층으로 넘겨라는 신호로 해당 플래그가 사용됩니다.
7). RST는 ReSeT으로 패킷을 보내는 측에서 현재 접속을 즉시 중단 하고 싶을 때, 사용합니다.
상대가 전달 받는 즉시 비 정상 종료로 연결이 끊어지게 됩니다.
8). SYN 는 SYNchronization으로 TCP에서 처음 연결을 시도할 때( 즉, 3-way handshake를 할 때 ), 사용합니다.
이는 수신측에서, 발신측과 연결을 원한다는 의미로도 해석됩니다.
9). FIN 는 FINish로 TCP에서 연결을 정상 종료 하려고 시도할 때( 즉, 4-way handshake를 할 때 ), 사용합니다.
이는 수신측에서, 더 이상 전송받을 데이터가 없다고 판단 한 경우( 즉, 확인 응답 번호가 목표 크기와 같은 경우 )
발신측에게 연결을 정상 종료 하기를 원한다는 의미로도 해석됩니다.