728x90
TCP와 UDP
'연결' 이라는 개념
- TCP에만 연결(Connection, Session, Circuit) 개념이 존재한다.
- 연결은 결과적으로 순서번호(Sequence Number)로 구현된다.
- 이는 1, 2, 3, … 과 같이 증가하는 것이 아니라, 차지하는 바이트(byte) 수만큼 증가한다. 예를 들어 첫번째 세그먼트(Segment)의 크기가 400byte라면 두번째 세그먼트는 401의 Sequence Number를 가지게 된다.
- 연결은 상태(전이) 개념을 동반한다.
TCP 연결 과정(3-way handshaking)
- 연결 과정 중에는 헤더(Header)와 페이로드(Payload)로 나뉜 일반적인 형태의 세그먼트가 아닌 IP 주소, TCP 주소가 존재하는 헤더만 존재하는 형태의 세그먼트가 오간다.
- 연결 과정에서 Sequence Number 교환, 정책(관리적 정보. 주고 받는 정보 중 가장 중요한 것이 MSS - 더 낮은 쪽에 맞춰 통신이 일어남)
상세 과정
- 클라이언트가 연결하고 싶다는 요청(
SYN
)을 서버의 특정 포트에 전송한다. 이 때, 클라이언트는 랜덤한 Sequence Number를 생성해 서버측에 알려준다. 전송직후 클라이언트의 상태는SYN_SENT
상태(연결요청 패킷을 전송한 상태)가 된다. 이 때, 서버측은 해당 포트가 청취 상태(LISTEN
. 즉, 연결요청수신이 가능한 상태)로 있어야 한다. - 서버는 연결하고자 하는 요청을 받고
SYN_RCVD
상태(연결요청수신 상태)가 되며, 클라이언트측에서 보낸 연결요청 패킷에 대한 연결요청응답 패킷을 전송한다. 이 때 받은 연결요청 패킷(SYN
)의 Sequence Number + 1과 새로운 응답 패킷(ACK
)을 랜덤 Sequence Number와 함께 전송한다. 이 때 서버는 연결요청수신 상태(SYN_RCVD
)에서 응답대기상태 (ACK_WAIT
)로 이동한다. - 클라이언트측은 서버에서 보낸 연결요청응답 패킷을 받음으로써 접속확립상태(
ESTABLISHED
)로 이동하여 TCP 연결을 완료한다. 또한 서버측에서 보낸 패킷에 대한 응답(ACK
)을 보낸다. ( + Sequence Number + 1) - 서버는 클라이언트측에서 보낸 패킷에 대한 응답(
ACK
)을 받고 접속확립 상태(ESTABLISHED
)가 된다.
TCP 연결 종료 과정(4-way handshaking)
- 클라이언트는 Active해서 연결을 시작하고자 하는 것도, 끊고자 하는 것도 모두 클라이언트여야 한다. 서버가 연결을 끊고자 한다면 이는 특이한 상황이다.
- 클라이언트측에는
TIME_WAIT
상태가 존재한다. 이는 곧 클라이언트가 연결 종료를 요청했다는 것을 의미한다. (서버에 TIME_WAIT 상태가 있다면 서버가 연결 종료를 요청했단 것으로 이는 프로토콜 설계가 잘못됐거나 일반적인 상황은 아니다.)TIME_WAIT
: 연결 종료를 요청했을 때 최종적으로 연결이 종료되기 전에 발생한다.- 서버측에서는 많은 연결 종료 요청을 받는 입장인데 만약 서버측에서 종료 요청을 하게 되면, 연결 마다
TIME_WAIT
상태가 발생하고 그동안 소켓 자원이 회수되지 않은 채 낭비가 되므로 서버측에서 연결 종료하는 구조를 지양하는게 좋다. → 애플리케이션 프로토콜(Ex. 웹이면 HTTP이므로 직접 개발하는 것이 X) 설계시 되도록 클라이언트가 Active하게 서버에 연결 종료를 요청하는 구조로 만드는 것이 좋다.
상세 과정
- 클라이언트가 먼저 FIN + ACK를 보내고 서버가 이에 대한 ACK를 보낸다. → 서버는 연결 종료 과정이 시작된
CLOSE_WAIT
상태가 된다. - 서버측에서 다시 FIN + ACK를 보내고 클라이언트 측에서 이에 대한 ACK를 보낸다. → 클라이언트는 최종적으로 연결 종료를 기다리는
TIME_WAIT
상태가 된다.TCP (연결) 상태 변화
TCP Header 형식
- Source Port, Destination Port: 송수신 포트
- Sequence number : 세그먼트 Sequence number(세그먼트 byte수만큼 더해짐)
- Acknowledge number : ACK (전송될 때 마다
ACK += 1
) - Data offset : 옵션(Options)의 유무 혹은 페이로드(Payload) 위치를 계산하려할 때 사용되는 개념으로, IP 주소의 IHL(Internet Header Length)와 유사하다.
- 다수의 플래그들
ACK
: 확인 응답SYN
: 연결 요청FIN
: 연결 종료 요청RST
: Reset. 연결중 문제가 생기면 연결을 끊자는 의미PSH
: Push. 버퍼링(버퍼에 데이터를 담는 과정)을 하지말고 즉시 보내자는 의미NS
,CWR
,FCE
: 혼잡 제어를 통제하기 위해 존재하는 플래그들- Cf. 혼잡 제어 : TCP 통신 중 발생되는 문제들(대표적으로 Loss, Re-Transmission + Duplicate-ACK, Out of Order, Zero-window 등이 존재)
- Window Size : 버퍼의 여유 공간
- Checksum : 검사합 값
UDP Header 형식
- Port(Src, Dst)
- Length
- Checksum
Cf. UDP는 TCP와 달리 수신측의 버퍼 고려 및 혼잡 제어 X. 일방적인 전송이 이루어진다.
파일 다운로드 중 LAN 케이블을 분리했다가 다시 연결하면 TCP 연결은 어떻게 될까?
답은 물리적인 연결은 끊어진 상태에서도 논리적인 연결은 일정 시간 동안 유지된다. 따라서 금방 꽂으면 다운로드가 일시 정지 했다가 다시 재개될 것이다. 이 때 연결이 끊기는 것과 같은 경우를 충격이 발생했다고 한다.
Cf. 유선에서는 LAN 케이블 분리와 같은 충격이 자주 일어나지 않지만, 무선 연결시에는 수시로 일어난다. 지하철 이동 중 기지국을 수시로 갈아타는 상황도 충격이 된다. 어떤 환경에서든 네트워크 통신 상태에 충격이 일어나는 경우 이 영향을 완화하기 위해 버퍼를 사용한다. (IPTV, 영상 스트리밍 등에서 데이터 수신이 잠시 되지 않아도 당장 시청에 방해가 되지 않도록 버퍼에 미리 데이터를 일정량 담아둔다.)
TCP 연결이라는 착각
- 재전송 타이머의 기본 근사 값은 대략 3초이다. 하지만 대부분의 운영체제들은 1초 미만이다.
- 재전송 타이머 만료 후에도 확인 응답을 받지 못한 경우 세그먼트를 재전송하고 RTO(Retransmission Time-Out) 값은 두 배로 증가한다.
- 예를 들어 1s > 2s > 4s > 8s > 16s 간격으로 재전송한다.
- 보통 최대 5회 재전송을 시도하고 5회 이상 모두 실패할 경우 보통 전송 오류가 발생한다. → 이 때에 이르러서야 논리적인 연결이 끊긴다.
TCP 연결과 게임 버그
어떤 MMORPG 게임에서 아이템 복제 버그가 발생했다. 이는 논리적 TCP 연결과 물리적 링크간의 차이를 이용한 시간차 공격이라 볼 수 있다. 연결은 사실상 End-point의 주관적 판단에 불과하다.
반응형
'개념' 카테고리의 다른 글
Network) DNS 동작원리 (1) | 2024.03.20 |
---|---|
Network) TTL, 단편화, DHCP, ARP, RTT (0) | 2024.03.19 |
Network) 특수한 IP 주소(Broadcast IP 주소, Loopback IP 주소) (0) | 2024.03.17 |
Network) IP 클래스와 서브넷팅, 서브넷 마스크 (0) | 2024.03.17 |
틈새 Network 공부(네트워크 계층, L2 - L4) (0) | 2024.03.16 |