[혼자 공부하는 네트워크] 4-2 TCP와 UDP
TCP 통신 단계와 세그먼트 구조
- TCP는 통신하기 전에 연결을 수립하고 통신이 끝나면 연결을 종료
- 데이터 송수신 과정에서 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어 등의 기능을 제공
- MSS(Maximum Segment Size) - TCP로 전송할 수 있는 최대 페이로드 크기
- 크기를 고려할 때 TCP 헤더 크기는 제외
- 헤더의 크기까지 포함했던 MTU와는 대조적

- 송신지 포트와 수신지 포트
- 송신지 또는 수신지 애플리케이션을 식별하는 포트 번호가 명시되는 필드
- 순서 번호(sequence number)
- 순서 번호가 명시되는 필드
- 순서 번호: 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호
- 확인 응답 번호(acknowledgement number)
- 상대 호스트가 보낸 세그먼트에 대한 응답
- 다음으로 수신하기를 기대하는 순서 번호가 명시
- 제어 비트(control bits), 플래그 비트(flag bits)
- 윈도우(window)
- 수신 윈도우의 크기 명시
- 수신 윈도우: 한 번에 수신하고자 하는 데이터의 양
제어 비트
- 기본적으로 8비트로 구성
- 각 자리의 비트는 각기 다른 의미
- ACK: 세그먼트의 승인을 나타내기 위한 비트
- SYN: 연결을 수립하기 위한 비트
- FIN: 연결을 종료하기 위한 비트
- ACK 비트가 1로 설정된 세그먼트, FIN 비트가 1로 설정된 세그먼트, SYN 비트가 1로 설정된 세그먼트 → ACK 세그먼트, SYN 세그먼트, FIN 세그먼트
순서 번호와 확인 응답 번호
- TCP의 신뢰성을 보장하기 위해 사용되는 중요한 필드
순서 번호
- 순서 번호는 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호
- 전송 계층이 응용 계층으로부터 전송해야 하는 1900바이트 크기의 데이터를 전달 받았다.
- MSS 단위로 전송될 수 있음. MSS가 500바이트라고 가정
- 세그먼트 A, B, C, D 순으로 전송된다고 가정

- 처음 통신을 위해 연결을 수립한 경우, 제어 비트에서 연결을 수립하기 위한 비트인 SYN 플래그가 1로 설정된 세그먼트의 경우 순서 번호는 무작위 값이 됨
- 이를 초기 순서 번호(Initial Sequence Number)라고 함
- 초기 순선 번호가 100이라면 가장 먼저 보내게 될 세그먼트 A의 순서 번호가 초기 순서 번호인 100이 되는 것
- 연결 수립 이후 데이터를 송신하는 동안 순서 번호는 송신한 바이트를 더해 가는 형태로 누적값을 가짐
- 순서 번호는 초기 순서 번호 + 송신한 바이트 수 (= 초기 순서 번호 + 떨어진 바이트 수)

확인 응답 번호
- 순서 번호에 대한 응답
- 다음에는 이걸 보내 주세요, 다음으로 제가 받을 순서 번호는 이것입니다.
- 확인 응답 번호는 수신자가 다음으로 받기를 기대하는 순서 번호
- 일반적으로 수신한 번호 + 1
- 확인 응답 번호 값을 보내기 위해서는 제어 비트에서 승인을 나타내는 비트인 ACK 플래그를 1로 설정 해야 함

TCP 연결 수립과 종료
연결 수립: 쓰리 웨이 핸드셰이크(three-way handshake)
- 3개의 단계로 이루어진 TCP 연결 수립 과정
- 처음 연결을 시작하는 호스트의 연결 수립 과정을 액티브 오픈(active open)
- 주로 서버-클라이언트 관계에서 클라이언트에 의해 수행
- 호스트 A의 동작
- 연결 요청을 받고 나서 요청에 따라 연결을 수립해주는 호스트의 연결 수립 과정을 패시브 오픈(passive open)
연결 종료
- TCP가 연결을 종료하는 과정은 송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으며 이루어짐


- 액티브 클로즈(active close)는 먼저 연결을 종료하려는 호스트에 의해 수행
- FIN 세그먼트를 먼저 보낸 호스트 A가 액티브 클로즈를 수행할 셈
- 패시브 클로즈(passive close)는 연결 종료 요청을 받아들이는 호스트에 의해 수행
TCP 상태
- 상태(state)는 현재 어떤 통신 과정에 있는지를 나타내는 정보
- TCP는 상태를 유지하고 활용한다는 점에서 스테이트풀(stateful) 프로토콜 이라고도 부름
연결이 수립되지 않은 상태
- CLOSED
- LISTEN
- 일종의 연결 대기 상태
- 일반적으로 서버로서 동작하는 패시브 오픈 호스트는 LISTEN 상태를 유지
- 액티브 오픈 호스트의 연결 요청인 SYN 세그먼트를 기다리는 상태
- 액티브 오픈 호스트가 LISTEN 상채인 호스트에게 SYN 세그먼트를 보내면 쓰리 웨이 핸드셰이크 시작
연결 수립 과정에서 주로 볼 수 있는 상태
- SYN-SENT
- 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 그에 대한 응답인 SYN + ACK 세그먼트를 기다리는 상태
- 연결 요청을 보낸 뒤 대기하는 상태
- SYN-RECEIVED
- 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태
- ESTABLISHED
- 연결이 확립되었음을 나타내는 상태
- 데이터를 송수신할 수 있는 상태를 의미
- 쓰리 웨이 핸드셰이크 과정에서 두 호스트가 마지막 ACK 세그먼트를 주고받으면 ESTABLISHED 상태로 접어듦
연결 종료 과정에서 주로 볼 수 있는 상태
- FIN-WAIT-1
- 연결 종료의 첫 단계
- FIN 세그먼트로서 연결 종료 요청을 보낸 액티브 클로즈 호스트는 FIN-WAIT-1 상태로 접어들게 됨
- CLOSE-WAIT
- 종료 요청인 FIN 세그먼트를 받은 패시브 클로즈 호스트가 그에 대한 응답으로 ACK 세그먼트를 보낸 후 대기하는 상태
- FIN-WAIT-2
- FIN-WAIT-1 상태에서 ACK 세그먼트를 받게 되면 FIN-WAIT-2 상태가 됨
- 상대 호스트의 FIN 세그먼트를 기다리는 상태
- LAST-ACK
- CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 이에 대한 ACK 세그먼트를 기다리는 상태
- TIME-WAIT
- 액티브 클로즈 호스트가 FIN 세그먼트를 수신한 뒤, 이에 대한 ACK 세그먼트를 전송한 뒤 접어드는 상태
- 패시브 클로즈 호스트가 마지막 ACK를 수신하면 CLOSED 상태로 전이하는 반면, TIME-WAIT 상태에 접어든 액티브 클로즈 호스트는 일정 시간을 기다린 뒤 CLOSED 상태로 전이
- 상대 호스트가 받았어야 할 마지막 ACK 세그먼트가 올바르게 전송되지 않았을 수 있기 때문에 일정 시간을 기다렸다가 연결을 종료
- CLOSING
- 보통 동시에 연결을 종료하려 할 때 전이되는 상태
- 서로가 FIN 세그먼트를 보내고 받은 뒤 그에 대한 ACK 세그먼트를 보냈지만, 아직 자신의 FIN 세그먼트에 대한 ACK 세그먼트를 받지 못했을 때 접어드는 상태
- 양쪽 모두가 연결 종료를 요청하고, 서로의 종료 응답을 기다리는 경우 CLOSING 상태로 접어든 셈
- ACK 세그먼트를 수신한다면 각자 TIME-WAIT 상태로 접어든 뒤 종료

정리
UDP 데이터그램 구조
- UDP는 TCP와 달리 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜
- 연결 수립 및 해제, 재전송을 통한 오류 제어, 혼잡 제어, 흐름 제어 등을 수행하지 않음
- 상태를 유지하지도 않음
- 스테이트리스(stateless) 프로토콜의 일종
- TCP에 비해 제공하는 기능이 적은 만큼 필드도 단순
- 송신지 포트와 수신지 포트
- 길이: 헤더를 포함한 UDP 데이터그램의 바이트가 담김
- 체크섬: 데이터그램 전송 과정에서 오류가 발생했는지 검사하기 위한 필드
- 수신지는 이 필드의 값을 토대로 데이터그램의 정보가 훼손되었는지를 판단하고, 문제가 있다고 판단한 데이터그램은 폐기
- 데이터그램이 훼손되었는지를 나타내는 정보라는 점에서 이 필드는 수신지까지 잘 도달했는지를 나타내는 신뢰성/비신뢰성과는 관련이 없음
- TCP에 비해 적은 오버헤드로 패킷을 빠르게 처리할 수 있음
- 실시간 스트리밍 서비스, 인터넷 전화처럼 실시간성이 강조되는 상황에서 TCP보다 더 많이 쓰임
- 수신지에 패킷들을 빠르게 마구 던지는 것과 같음
- 이 과정에서 패킷이 손실되거나 패킷의 순서가 바뀔 수도 있다.
