728x90
# TCP 연결 수립 과정
연결 수립 / 연결 해제 시 : 상대방이 보낸 시퀀스 번호 +1 로 승인 번호를 계산하여 반환
0.init
- Client : CLOSED
- client_seq_num = 0
- Server : LISTEN
- server_seq_num = 100
1. client -> server / SYN
- Client : SYN-SENT
- seq_sum = 0
- Server : CLOSED
2. server -> client / SYN + ACK
- Client : SYN-SENT
- Server = SYN_RECIEVED
- ack_num = 1_seq_num +1 == 0+1 ==1
- seq_num = 100
3. client -> server / ACK
- Client : ESTABLISHED
- ack_num = 2_seq_num + 1 == 100 +1 ==101
- Server = SYN_RECIEVED
# 데이터 전송 과정
- 상대방이 보낸 시퀀스 번호 + 자신이 받은 데이터의 byte로 승인 번호를 만들어 냄
- ACK : 송신자가 다음으로 수신하기를 기대하는 바이트의 시퀀스 번호
클라이언트 -> 서버
전제조건
- 크기가 1024byte인 데이터를 전송하고자 한다.
- 예시의 경우 TCP로 전송할 수 있는 데이터의 최대 크기가 512byte로 제한되어있어 2개의 세그먼트로 전송
클라이언트
- 2개의 세그먼트 전송
서버
- 2 개의 세그먼트 수신
- 가장 마지막으로 수신한 세그먼트의 seq_num에 전송받은 데이터의 크기를 합.
-> ACK = 513(seq_num) +512(data_size) == 1025
서버 -> 클라이언트
동일하게 동작.
! 서버의 seq_num과 클라이언트의 seq_num은 다름
# 연결 해제 과정
- 4-way Handshaking
- 세션을 종료하기 위해 수행
- 찬 곳 : active closer
- 차인 곳 : passive closer
0.init
- Client : Established
- Server : Established
1. client -> server / FIN
- Client : FIN-WAIT-1
- Server : Establish
2.server -> client / ACK
- Client : FIN-WAIT-1
- Server : CLOSE-WAIT
- 확인 메세지 전송
- 자신의 통신이 끝날 때 까지 대기.
3. server -> client / FIN
- Client : FIN-WAIT-1
- Server : LAST-ACK
- 서버의 통신 종료
- 클라이언트에게 FIN 플래그 전송
4. client -> server / ACK
- Client : TIME-WAIT
- 확인 메세지 전송
- Server : CLOSED
❗️TIME-WAIT상태
- TCP 연결 종료 시, 데이터 유실이나 네트워크 문제로 인해 발생할 수 있는 혼란을 방지하기 위한 안전장치
- 뒤늦게 도착한 데이터의 유실 및 새로운 세션에 영향을 줄 수 있는 경우 방지
동작 예시
- Server → Client: 데이터 전송 중 일부 지연 발생 (seq_num=513)
- Server → Client: FIN 패킷 전송
- Client: FIN 패킷 수신 후 ACK 전송 및 TIME_WAIT 상태 진입
- 지연된 데이터 패킷(seq_num=513)이 TIME_WAIT 기간 내에 도착 → 정상 처리
- TIME_WAIT 시간 종료 → 세션 완전 종료
728x90
'😒 저 저 저 개념없는 나 > 🌐 네트워크' 카테고리의 다른 글
[네트워크] TCP 헤더 (1) | 2024.11.24 |
---|---|
[네트워크] 프록시 | 로드밸런서 (0) | 2024.11.22 |
[네트워크] SSH (0) | 2024.11.22 |
[네트워크] HTTPS | SSL | TLS (1) | 2024.11.22 |
[네트워크] HTTP | URI | 요청 응답 (0) | 2024.11.21 |