TCP/UDP는 전송계층에서 사용하는 대표적인 프로토콜로, 장비들 간의 통신과정에서 데이터를 순차적으로 에러없이 안정적으로 교환할 수 있게 하는것에 목적을 둔 프로토콜이다.
전송계층은 네트워크 구성요소와 프로토콜 내에서 송신자와 수신자를 연결하는 통신서비스를 제공하는 계층이다.
전송계층은 신뢰성(연결형 통신)과 효율성(비연결형 통신)으로 구분할 수 있으며, 연결형 통신은 데이터를 정상적으로 정확하게 전송하는 것이고, 비연결형 통신은 데이터를 효율적으로 빠르게 전송하는 것이다.
대표적인 연결형 통신은 TCP(Transmission Control Protocol)이 있고, 비연결형 통신은 UDP(User Datagram Protocol)이 있다.
네트워크 계층의 전송계층에 속해 있으며, 인터넷 상에서 데이터를 메세지 형태로 보내기 위해 IP와 함께 사용하고 전송을 제어하는 프로토콜이다.
TCP프로토콜은 가상회선 패킷교환 방식을 제공한다.
3-way handshake을 통해 연결을 설정하고 4-way handshake과정을 거쳐 해제한다.
흐름제어와 혼잡 제어가 가능하고 높은 신뢰성을 보장하는 대신 UDP보다 속도가 느리다.
전이중 방식과 점대점 방식
흐름제어(Flow control)
송신자의 데이터 전송량, 전송속도와 수신자간의 데이터 처리 속도 차이로 인한 버퍼 오버플로우를 방지한다.
수신자가 Window Size 값을 통해 수신량을 설정가능혼잡제어(Congestion control)
네트워크 내의 패킷수가 초과하지 않도록 방지한다.
높은 신뢰성(Reliable transmission)
Dupack-based retransmission (패킷 이상을 감지할 경우 재전송 요청)
Timeout-based retransmission (일정 시간동안 수신을 못할경우 재전송 요청)전이중(Full-Duplex)
전송이 양방향으로 동시에 일어날 수 있음
점대점(Point to Point)
각 연결이 정확히 2개의 종단점을 가지고 있음
TCP프로토콜은 통신과정에서 데이터를 여러 블록으로 나누어 각 블록마다 TCP Header를 붙여 만든 세그먼트(Segment)단위의 데이터를 주고 받는다.

TCP Header에 대해서 설명을 하면, 내용이 너무 길어지니 간단하게 TCP프로토콜의 연결과 연결해제 과정에 대해서 알아본다.
TCP프로토콜의 연결은 3-way handshake 과정을 통해 세션을 수립한다.

1. initiator에서 receiver에 랜덤한 수로 시퀀스 번호를 생성해서 SYN패킷을 전송한다. 이때 receiver의 상태는 LISTEN이여야 한다.
initiator의 상태는 SYN_SENT가 되고, SYN패킷을 제대로 받았다면 receiver의 상태는 SYN_RECV가 된다.

2. receiver에서 initiator로부터 제대로 된 시퀀스 번호를 받았다는 의미로 승인번호(Acknowledgement number) 값을 만들어서 다시 전송한다.
승인번호는 처음에 initiator에서 보낸 시퀀스 번호에 1을 더한 값이다.
이때 TCP Header의 ACK플래그 필드의 값이 1로 설정되는데, 이 패킷에는 유효한 승인번호가 있다는 것을 의미한다.
또한 랜덤한 수로 자신의 시퀀스 번호를 생성하여 initiator으로 전송한다.

3. initiator에서는 receiver에서 보낸 승인번호(Acknowledgement)를 자신이 처음보낸 시퀀스번호와 비교해서 연결이 제대로 성립되었는지를 확인할 수 있다.
승인번호는 2단계에서 receiver에서 initiator로 부터 제대로 된 시퀀스번호를 받았다는 의미의 시퀀스번호 + 1값으로 설정된 승인번호를 만든다고 했다.
이후에 initiator은 연결이 성립되었다고 판단하고 ESTABLISHED 상태가 되고, receiver에서 새로 만들어 보내준 시퀀스 번호에 1을 더하여 승인번호 값으로 설정하여 receiver로 보낸다.
receiver는 initiator와 마찬가지로 자신이 보낸 시퀀스번호와 initiator로부터 받은 승인번호의 값을 비교하여 번호의 차이가 1이라면 연결이 성립되었다고 판단하고 ESTABLISHED 상태로 전환하면서 본격적인 통신을 시작할 수 있다.
TCP프로토콜은 연결을 해제할 때도 특정과정을 거치게된다.

1. 요청자가 수신자에게 FIN패킷을 보내면서 FIN_WAIT_1 상태로 전환한다.
이때 FIN패킷은 요청자가 보내야할 시퀀스번호가 포함되어있는데, 3-way handshake와 달리 시퀀스번호를 초기화할 필요 없이 이번에 보내야할 시퀀스번호가 포함되어있다.

2. FIN패킷을 받은 수신자는 CLOSE_WAIT 상태로 전환하면서 ACK패킷을 전송한다.(요청자가 보낸 시퀀스 번호 + 1)
ACK패킷을 받은 요청자는 FIN_WAIT_2 상태로 전환을 하게 되는데, 수신자가 더 보낼 데이터가 있을지도 모르니 대기를 하는것이다.
하지만 무한정 대기를 하는 것은 아니고 일정시간이 경과하면 다음 상태로 전환이 된다.

3. 더이상 처리할 데이터가 없는 수신자는 요청자에게 FIN패킷을 전송하고 LAST_ACK상태로 전환하고 요청자가 승인 번호를 보내줄 때까지 기다린다.

4. 수신자로부터 받은 FIN패킷을 받은 요청자는 다시 시퀀스번호 + 1로 승인번호를 만들어 ACK패킷을 수신자에게 보내고 TIME_WAIT상태로 전환한다.
TIME_WAIT상태는 의도하지 않은 에러로 인해 데드락(Dead lock)에 빠지는 것을 방지하는 역할이다.
ACK패킷을 받은 수신자는 CLOSED상태로 전환하며 연결을 완전히 종료한다.
UDP는 TCP와 달리 비연결형 서비스로 데이터그램 패킷 교환방식을 제공한다.
또한 연결을 설정하고 해제하는 과정이 존재하지 않으며, 흐름제어가 없어 데이터가 제대로 전송되었는지 오류가 없는지 확인하지 않는다.
UDP헤더의 CheckSum필드를 통해 최소한의 오류만 검출하고 TCP보다 속도가 빨라 성능이 중요시 되는 곳에 사용이된다.