간단 개요
1. 클라이언트 -> 서버 : 연결 요청
2. 서버 -> 클라이언트 : 연결 요청 확인&수락
3. 클라이언트 -> 서버 : 요청 수락 확인
1. 클라이언트에서 서버로 SYN요청을 보냄
SYN(Synchronization): TCP 의 제어플래그 중 하나.
'이 세그먼트로 연결을 시작합니다'
2. 서버에서 클라이언트로 SYN+ACK 응답을 보냄
ACK(Acknowlege): TCP의 제어플래그 중 하나.
'이 세그먼트는 요청에 대한 응답입니다.'
3. 클라이언트에서 서버로 ACK 응답을 보냄
3way handshake는 TCP에서 연결을 처음 시작할 때 사용하는 일종의 관례
간단 개요
1. 클라이언트 -> 서버 : 종료 요청
2. 서버 -> 클라이언트 : 요청 응답
3. 서버 -> 클라이언트 : 종료 요청 수락
4. 클라이언트 -> 서버 : 수락에 대한 응답
1. 클라리언트에서 서버로 FIN 요청
FIN(Finish): TCP의 제어플래그 중 하나
'이 세그먼트로 연결 종료를 요청합니다.'
2. 서버에서 클라이언트로 ACK 응답
3. 서버에서 클라이언트로 FIN 요청
4. 클라이언트에서 서버로 ACK응답
클라이언트가 서버의 FIN에 대해 ACK을 보낸 후 연결이 '즉시' 종료되지 않는다.
이 기간을 TIME-WAIT이라고 한다.
서버가 FIN과 ACK을 거의 동시에 보내는 경우 그림과 같이 FIN+ACK으로 나가기도 한다.
클라이언트의 상태 | 서버의 상태 | 액션 |
---|---|---|
ESTABLISHED | ESTABLISHED | 데이터 주고 받음(아직 종료요청 X) |
FIN-WAIT1 | CLOSE-WAIT | 클라이언트 FIN 보냄, 서버 FIN 받음 |
FIN-WAIT2 | CLOSE-WAIT | 클라이언트 ACK 받음, 서버 ACK 보냄 |
FIN-WAIT2 | LAST-ACK | 클라이언트 FIN 받음, 서버 FIN 보냄 |
TIME-WAIT | CLOSED | 클라이언트 ACK 보냄, 서버 ACK 받음 |
CLOSED | CLOSED | 2MSL이 지남 |
2MSL(Maximum Segment Lifetime):패킷이 폐기되기 전에 네트워크에서 살아있을 수 있는 시간
TIME-WAIT은 왜 필요한가
지연 패킷 문제 : 새로운 연결이 성사됐는데 이전 상대가 보낸 데이터가 이제서야 도착하면 문제가 생길 수 있음.
연결 종료 문제: 서버가 ACK을 보내고 Last-Ack에 빠졌는데 해당 Ack이 중간에 손실된 상황리라 치자. 서버입장에선 아무리 기다려도(Last-ack상태) 답장이 없으니 다시 Fin을 보낸다. 이때 클라이언트가 time-wait없이 즉시 종료됐다면 클라이언트는 당연히 답장을 안해줄 거고 서버는 무한 대기가 된다.
TIME-WAIT가 왜 필요한지에 대해 이유를 따로 정리해주셔서 이해가 잘 되었던것 같습니다! 😊