TCP와 UDP는 어떻게 통신할까?
TCP 통신 (Transmission Control Protocol)
--
TCP는
신뢰할 수 있는 통신을 위한 연결형 프로토콜이다.
TCP 통신의 단계를 크게 3단계로 나눌 수 있다.
- 통신하기 전에 연결하기
- 데이터 통신 수행
- 통신이 끝나면 연결 종료하기
MTU (Maximum Transmission Unit)은
네트워크를 통해 전송할 수 있는 데이터의 최대 크기를 의미한다.
여기서 "IP MTU"는 IP 네트워크에서 하나의 IP 패킷이 가질 수 있는 최대 크기를 의미한다.
MSS (Mazimum Segment Size)는
TCP에서 사용하는 개념으로 TCP로 한 번에 전송할 수 있는 최대 데이터 크기를 의미한다.
해당 데이터는 TCP 세그먼트에서 실제 데이터(Payload)의 크기를 가리키며,
TCP 헤더와 IP 헤더는 포함되지 않는다.
TCP 세그먼트 헤더 구조
- 송신지 포트(Source Port) & 수신지 포트 (Destination Port) :
필드 이름 그대로 송신지와 수신지 애플리케이션을 식별하는 포트 번호가 명시되는 필드 - 순서 번호 (Sequence Number) :
송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 byte에 부여되는 번호 - 확인 응답 번호 (Acknowledgment Nubmer) :
상대 호스트가 보낸 세그먼트에 대한 응답 / 다음으로 수신하기를 기대하는 순서 번호 - 제어 비트 (Control Bits) :
현재 세그먼트에 대한 부가 정보 (플래스 비트(Flag Bits)라고도 부름) - 윈도우 (Window) :
수신 윈도우의 크기 (수신 윈도우 = 한 번에 수신하고자 하는 데이터 양)
제어 비트
제어 비트 필드는 기본적으로 8bit로 구성된다.
이 중에서
TCP의 기본 동작을 논할 때 가장 자주 언급되는 3개의 제어 비트가 있다.
- ACK : 세그먼트의 승인을 나타내기 위한 비트
- SYN : 연결을 수립하기 위한 비트
- FIN : 연결을 종료하기 위한 비트
순서 번호 & 확인 응답 번호
두 필드는 TCP의 신뢰성을 보장하기 위해 사용되는 중요한 필드로, 한 쌍으로 묶어서 생각하는 것이 좋다.
순서 번호는
세그먼트의 올바른 송수신 순서를 보장하기 위한 번호로
세그먼트 데이터의 첫 바이트에 부여되는 번호다.
만약 응용 계층에서 전달받은 데이터의 크기가 1800byte고,
MSS 단위가 500byte라면, 해당 데이터를 MSS 단위로 쪼개어 보내야 한다.
그래서 총 4개의 세그먼트로 쪼갤 수 있으며 각 a, b, c, d 순으로 전송된다고 가정하자.
통신을 위해 연결 수립이 된 경우
즉, 제어 비트에서 SYN 플래그가 1로 설정된 세그먼트의 경우
순서 번호는 무작위 값으로 지정된다.
이를 "초기 순서 번호"라고 부르며 위 그림에서는 100이라고 가정했다.
그 이후의 세그먼트의 순서 번호는 "초기 순서 번호" + "송신한 바이트 수"가 된다.
순서 번호는 세그먼트상에서 32bit로 표현된다.
만약 해당 비트 수로 표현 가능한 수를 넘어가면 다시 0부터 시작한다.
확인 응답 번호는
수신자가 다음으로 받기를 원하는 순서 번호를 명시하는 필드다.
즉, 다음으로 받고 싶어하는 세그먼트의 순서 번호다.
--
TCP 연결 수립 & 종료
--
TCP는
통신 이전에 미리 연결을 수립하고,
통신 이후에는 연결을 종료한다.
연결 수립
TCP의 연결 수립은
"쓰리 웨이 핸드셰이크 (3-way Handshake)"를 통해 이루어진다.
말 그대로 3 단계로 이루어진 TCP의 연결 수립 과정이다.
위와 같은 3 단계를 거친 뒤에 본격적으로 송수신이 시작된다.
이때 처음 연결을 시작하는 호스트의 연결 수립 과정을 "액티브 오픈(Active Open)"이라고 부르며,
반대로 연결 요청을 받고 해당 요청에 따라 연결을 수립해 주는 과정을 "패시브 오픈(Passive Open)"이라고 부른다.
연결 종료
데이터 송수신이 끝났다면 해당 연결을 종료하기 위해
송수신 호스트는 각자 한 번씩 FIN과 ACK를 주고받으며 연결 종료하는 과정을 이룬다.
--
TCP 상태
--
TCP에는 다양한 상태가 존재한다.
(현재 어떤 통신 과정에 있는지 나타내는 정보)
그래서 TCP는 상태를 유지하고 활용한다는 점에서 "스테이트풀(Stateful) 프로토콜"이라고도 부른다.
연결하지 않은 상태
- CLOSED : 아무런 연결이 없는 상태
- LISTEN : 연결 대기 상태 (일반적으로 연결 요청을 받는(서버) 호스트의 상태
연결 수립 상태
- SYN-SENT : 액티스 오픈 호스트가 "SYN 세그먼트"를 보낸 뒤에 해당 응답을 기다리는 상태
- SYN-RECEIVED : 패시브 오픈 호스트가 "SYN+ACK 세그먼트"를 보낸 뒤에 해당 응답을 기다리는 상태
- ESTABLISHED : 연결이 되었다는 상태 (데이터 송수신이 가능한 상태)
연결 종료 상태
- FIN-WAIT-1 : 연결 종료의 첫 요청(FIN 세그먼트)을 보낸 뒤에 "ACK 세그먼트" 응답을 기다리는 상태
- CLOSE-WAIT : 종료 요청(FIN 세그먼트)응답을 전달 후 대기하는 상태
- FIN-WAIT-2 : 첫 요청(FIN 세그먼트)의 응답(ACK 세그먼트)을 받고 다음 요청을 더 기다리는 상태
- LAST-ACK : CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤에 이에 대한 응답을 기다리는 상태
- TIME-WAIT : FIN 세그먼트에 대한 종료 완료 응답을 전달한 뒤에 종료될 때까지 기다리는 상태
--
UDP 구조
--
UDP는
TCP와 달리 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜이다.
그래서 연결 수립 및 해제, 재전송을 통한 오류 제어, 혼잡 제어, 흐름제어 등을 수행하지 않으며,
TCP처럼 상태를 유지하지도 않는다.
그래서 UDP는 "스테이트리스(Stateless)" 프로토콜이라고도 부른다.
UDP 구조
- 송신지 포트 & 수신지 포트 : 송수신지의 포트 번호
- 크기 : 헤더를 포함한 UDP 데이터그램의 Byte
- 체크섬 : 데이터그램 전송 과정에서 오류가 발생했는지 검사하기 위한 필드
(수신지는 해당 필드를 통해 데이터그램의 정보가 훼손되었는지 판단 후 만약 훼손되었다면 폐기)
--
'CS > 네트워크' 카테고리의 다른 글
[응용 계층] DNS (0) | 2024.11.23 |
---|---|
[전송 계층] TCP의 오류, 흐름, 혼잡 제어 (0) | 2024.11.22 |
[전송 계층] 전송 계층 (0) | 2024.11.20 |
[네트워크 계층] 라우팅 (0) | 2024.11.19 |
[네트워크 계층] IP 주소 (0) | 2024.11.18 |