TCP와 UDP는 전송계층에서 사용되는 프로토콜이다.
전송계층은 프로토콜 내에서 송신자와 수신자를 연결하는 통신 서비스를 제공하는 계층인데,
ip에 의해 전달되는 패킷의 오류를 검사하고 재전송 요구 등의 제어를 담당한다.
이러한 전송계층에서는 TCP와 UDP 프로토콜이 사용된다.
각 프로토콜에 대해 살펴보고 그 둘의 차이점에 대해 살펴보자.
TCP는 네트워크 계층 중 전송 계층에서 사용하는 프로토콜로서, 장치들 사이에 논리적인 접속을 성립하기 위하여 연결을 설정하여 신뢰성을 보장하는 연결형 서비스 이다. TCP는 네트워크에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟(데이터, 메세지, 세그먼트라는 블록 단위)를 안정적으로, 순서대로, 에러없이 교환할 수 있게 한다.
TCP는 다음과 같은 특징이 있다.
연결형 서비스
연결형 서비스로 가상 회선 방식을 제공
흐름제어(Flow control)
데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지
혼잡제어(Congestion control)
네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지
신뢰성이 높은 전송(Reliable transmission)
Sequence Number, Ack Number를 사용하여 ACK 가 중복으로 오거나 안올 경우 패킷 이상을 감지하여 해결
전이중, 점대점 방식
전이중 (Full-Duplex): 전송이 양방향으로 동시에 일어날 수 있다.
점대점 (Point to Point): 각 연결이 정확히 2개의 종단점을 가지고 있다.
TCP는 데이터를 Segment 단위로 쪼개서 전송한다.
TCP Segment가 무엇으로 이루어져 있고, 각각의 역할을 알아보자.
TCP Header 10개의 필수 필드 및 옵션 확장 필드들을 포함한다.
데이터 섹션의 내용은 애플리케이션의 페이로드(payload) 데이터이다.
페이로드 전송의 근본적인 목적이 되는 데이터의 일부분으로 그 데이터와 함께 전송되는 헤더와 메타데이터와 같은 데이터는 제외한다.
TCP Header에 대해 좀 더 자세히 살펴보자.
Transport Layer는 하나의 Application 안에 여러 process에 대한 구분을 짓기 위해 port 넘버를 부여한다. 각 16bit 공간에 Source와 Destination의 포트 주소를 저장한다.
TCP 세그먼트 안의 데이터의 송신 바이트 흐름의 위치를 가리킨다.
다른 호스트로 전달되는 패킷은 여러 개의 서로 다른 경로를 거치면서 전달되다 보니 패킷의 순서가 뒤바뀔 수 있다.
이를 수신 측에서는 재 조립해야 할 필요가 있는데 이 때 Sequence Number를 이용하여 조립하게 된다.
ACK 플래그가 설정된 경우 이 필드의 값은 수신자가 예상하는 다음 시퀀스 번호이다.
한쪽이 보낸 최초의 ACK는 반대쪽의 초기 시퀀스 번호 자체에 대한 확인응답이 되며, 데이터에 대한 응답은 포함되지 않는다.
HLEN : 32-bit 워드 단위로 나타낸 TCP 헤더 크기값이다.
헤더의 최소 크기는 5 워드이며 (TCP Option이 없는 경우) 최대 크기는 15 워드이다.
Reserved : 미래를 위해 예약된 필드
Control field : 기존의 6개의 Flag와 RFC 3168, 3540에 의해 추가된 3개의 Flag로 총 9개의 Flag로 이루어져 있다.
수신하고자 하는 윈도우의 크기이다.
받을 수 있는 최대 크기는 2의 16승으로 65535까지를 받을 수 있다.
오류 검출을 위해 사용되는 필드이다.
헤더 및 데이터를 16bit 단위로 분할하여 비트 합을 구한 뒤 여기에 1의 보수를 취한 값이다.
송신자는 이 알고리즘에 의해 계산된 체크섬을 이 필드에 삽입하고, 송신자는 같은 알고리즘으로 계산해서 동일한지 확인한다.
TCP는 연결 지향적인 프로토콜로, 데이터를 전송하기 전에 두 호스트 간에 연결을 설정해야 한다.
이 과정에서 3-way Handshaking과 4-way Handshaking이 사용된다.
PORT 상태 정보
- CLOSED: 포트가 닫힌 상태
- LISTEN: 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV: SYNC 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED: 포트 연결 상태
Flag 정보
- SYN(Synchronize Sequence Number)
- Connection을 생성할 때 사용하는 Flag
- Sequence Number를 랜덤으로 생성하여 세션을 연결하는 데 사용
- ACK(Acknowledgement)
- 패킷을 받았다는 것을 의미하는 Flag
- Acknowledgement Number 필드가 유효한지 나타낸다.
- FIN(Finish)
- 세션 연결을 종료시킬 때 사용하는 Flag
- 더 이상 전송할 데이터가 없음을 의미한다.
TCP의 연결 과정은 위의 그림과 같다.
일반적으로 Client와 Server 모두 연결 요청을 먼저 할 수 있다.
3-Way Handshaking은 양쪽 모두 데이터를 전송할 준비가 되어있다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 다른 한쪽이 준비되었다는 것을 알 수 있도록 해준다.
3-Way Handshaking의 동작 과정을 살펴보면 다음과 같다.
Client가 Server에게 접속을 요청하는 SYN Flag를 보낸다.
SYN_SENT
LISTEN
Server는 Listen 샅애에서 SYN이 들어온 것을 확인하고 SYN + ACK Flag를 Client한테 전송한다.
ESTABLISHED
SYN_RCV
SYN + ACK 상태를 확인한 Client는 서버에게 ACK를 보내고 연결 성립이 된다.
ESTABLISHED
ESTABLISHED
4-Way Handshaking은 TCP 연결을 종료하는 프로세스다.
4-Way Handshaking은 연결이 안전하게 종료되고 데이터 손실 및 혼란을 방지하기 위해 사용된다.
TCP는 두 가지의 연결 해제 방식이 존재한다.
Abrupt connection release(예기치 못한 연결 해제)
RST(TCP reset) Flag가 설정된 Segment가 전송되면 갑작스러운 연결 해제가 수행되는데, RST 세그먼트는 다음과 같은 경우에 전송된다.
Graceful connection release(정상적인 연결 해제 방식)
연결 종료 요청도 일반적으로 클라이언트와 서버가 모두 먼저 요청을 할 수 있다.
정상적인 연결 해제는 4-Way Handshaking을 통해 이루어 진다.
4-Way Handshaking의 동작 과정을 살펴보면 다음과 같다.
Server와 Client가 연결된 상태에서 Client가 close()를 호출하여 접속을 끊는다.
FIN-WAIT-1
ESTABLISHED
Server는 FIN Flag를 받고, 확인했다는 ACK를 Client에게 보내고 자신의 통신이 끝날때까지 기다린다.(남은 데이터를 마저 전송)
FIN-WAIT-2
CLOST-WAIT
데이터를 모두 보내 Close 준비가 다 된 후 Server는 Client에게 FIN Flag를 전송한다.
FIN-WAIT-2
LAST-ACK
Client는 FIN Flag를 받고, 확인했다는 ACK Flag를 Server에게 보내고 TIME-WAIT
상태로 들어간다.
TIME-WAIT
상태는 의도치않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지하기 위해 변경 되는 것인데, 만약 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED
상태로 변경된다.
TIME-WAIT
-> CLOSED
CLOSED
TCP 회피 방식들을 활용한 다양한 혼잡 제어 정책이 존재하고, 정책들은 AIMD, Slow Start를 적절히 섞어서 사용하되 네트워크 혼잡 상황이 발생했을 때 어떻게 대처하는지에 따라서 나뉘게 된다.
TimeOut
송신측이 수식측에 데이터를 보낸 이후,여러가지 요인으로 인해서 보낸 데이터가 유실되었다거나 수신측이 데이터를 받고 전송한 ACK 응답이 유실되어 송신측이 일정 시간동안 응답받지 못하는 경우
ssthresh
- slow start threshold
- 여기까지만 slow start 를 사용하겠다는 의미
UDP는 비연결형 프로토콜로 보안과 신뢰성보다 전송 속도와 효율성이 더 중요한 경우 데이터를 전송하기 위해 IP과 함께 오래 사용된 프로토콜이다.
UDP의 Header는 TCP의 Header에 비해 상당히 간결하다.
soutce port number, destination port number, checksum과 UDP의 Header와 Data의 크기를 합친 length로 이루어져 있다.