TCP

Jiny's 개발 일기·2023년 2월 28일
0

Article

목록 보기
3/9

연결과 해제

3-way handshake

SYN -> SYN + ACK -> ACK

  1. Client: SYN을 보내고 SYN-SENT 상태가 됨
  2. Server: ACK + (flag가 설정된 SYN)을 보내고 SYN-RECEIVED 상태가 됨
  3. Cleint: ACK를 보내고 ESTABLISHED 상태가 됨

4-way handshake

FIN -> ACK + FIN -> ACK

  1. Client: FIN 전송 후 FIN-WAIT-1 상태가 됨
  2. Server: ACK(Client 종료 요청) 후 서버는 CLOSE-WAIT 상태가 됨
    • Client는 ACK 수신 후 FIN-WAIT-2 상태가 되며 서버가 종료되길 대기
  3. Server: FIN(서버 종료 준비 완료)
    • Client는 FIN 수신 후 TIME-WAIT 상태로 돌아가 MSL 동안 기다리다 종료
  4. Client: FIN 수신 하면 ACK 송신
    • Server는 ACK 수신 후 종료

TIME-WAIT

TCP 상태의 가장 마지막 단계이며 close()를 요청한 곳에서 최종적으로 남게되며 기본적으로 2 MSL 동안 유지됨

필요성

  1. TIME-WAIT가 너무 짧으면 지연되었던 패킷이 뒤늦게 도착하는 문제가 생김
    • prevent delayed segments로 알려져 있음
    • 매우 드문 경우라고 한다.
    • 근데 TIME_WAIT의 타임아웃 정보는 커널 헤더 include/net/tcp.h 에 하드 코딩 되어 있으며 변경이 불가능하다.

  1. ACK 유실 시 상대방은 LASK-ASK에서 못빠져나옴
  2. 그래서 Server가 FIN을 다시 보내면 Client는 종료해버려서 Server는 ACK를 못받음
  3. 이러면 Server는 소켓을 Close 할 수 없음

참고 문헌

profile
옛날 블로그 주소 : https://jeongjin984.github.io/

0개의 댓글