본문 바로가기

개발/지식

3Way-Hand Shaking vs 4Way-Hand Shaking

TCP는 장치들 사이에 논리적인 접속/해제 를 성립하기 위해 일종의 약속을 정해두었다.

 

3way - Handshaking

TCP/IP 프로토콜로 통신하는 응용프로그램이 데이터를 전송하기 전에 정확한 전송을 보장하기 위해 세션 연결을 수립하는 과정을 말한다.

양쪽 모두 데이터를 전송 할 준비가 되었다는 것을 보장하고, 실제 데이터를 전달하기 전에 다른쪽이 준비되었다는 것을 알 수 있도록 한다.

양쪽 다 상대편에 대한 초기 순차 일련번호(SYN)를 얻는다.

1. client에서 접속을 요청하는 SYN(a)을 전송하고 SYN_SENT 상태로 대기한다.

2. server는 SYN을 받으면 SYN_RECEIVED 상태로 변경하고 SYN(b)+ACK(a+n)를 보내 연결 요청을 수락한다.

3. client SYN+ACK를 받으면 ACK(b+n)를 보내면서 ESTABLISHED 상태로 변경하면서 연결이 성립된다.

4. server도 ACK를 받고 ESTABLISHED 상태로 변경한다.

 

   ----   Start Send Data   ----

 

* SYN : 세션 설정에 사용할 시퀀스 넘버 - 임의 생성

* ACK : sender가 보낸 시퀀스 넘버에 TCP 계층에서의 길이 또는 데이터의 양을 더한 값.
            ACK 을 통해 보낸 패킷에 대한 손실을 판단하여 재전송 하거나 다음 패킷을 전송한다.

 

4way - Handshaking

TCP/IP 프로토콜로 통신하던 응용프로그램이 세션을 종료하는 과정을 말한다.

-------------  ESTABLISHED state ----------------

 

1. client에서 close()를 호출하면 FIN을 전송하고 FIN_WAIT1 상태로 대기한다.

2. server는 FIN을 받으면 CLOSE_WAIT 상태로 변경하고.
    ACK를 전달하면서 해당 포트에 연결되어 있는 어플리케이션에게 close()를 요청한다.

3. client가 ACK를 받으면 FIN_WAIT2 상태로 변경하고 대기한다.

4. server의 해당 어플리케이션이 close()를 요청 받아 종료프로세스를 모두 종료하면
    FIN을 client에게 전송하고 LASK_ACK 상태로 대기한다.

5. client가 FIN을 받으면 ACK 응답을 전송하고 TIME_WAIT 상태로 변경한다.
   일정 시간이 지난 후 CLOSED 상태로 변경된다.

6. server는 ACK를 받으면 CLOSED상태로 변경하며 포트를 닫는다. 

 

  • client / server 역할이 항상 위와 같은 것은 아니다. 
      client = Active Close    (Initiator)
      server = Passive Close  (Receiver)
    로 구분하여 위에서의 client/server 역할이 바뀔 수도 있다. (즉, server가 먼저 close()를 요청할 수 있다)
  • server가 먼저 FIN을 보내 클라이언트가 CLOSE_WAIT 상태에 빠지는 이슈 에 대한 자세한 내용을 아래 블로그(tech.kakao) 참조 

https://tech.kakao.com/2016/04/21/closewait-timewait/

 

CLOSE_WAIT & TIME_WAIT 최종 분석

트래픽이 많은 웹 서비스를 운영하다보면 CPU는 여유가 있지만 웹서버가 응답을 제대로 처리하지 못하고 먹통이 되는 경우를 종종 보게 됩니다. 여러가지 이유가 있겠지만, 이 글에서는 가장 대표적인 경우인 CLOSE_WAIT 상태를 재현하고 원인과 문제점 그리고 해결책을 알아봅니다. 나아가 TIME_WAIT의 동작 과정을 직접 만든 예제와 리눅스 커널 소스를 통해 확인하고, 인터넷에 퍼진 낡은 그래서 더이상 유효하지 않은 정보들을 바로 잡습니다. Part [

tech.kakao.com

 

https://asfirstalways.tistory.com/356

 

[TCP] 3-way-handshake & 4-way-handshake

[TCP] 3-way-handshake & 4-way-handshake 연결 성립(Connection Establishment) 1) 클라이언트는 서버에 접속을 요청하는 SYN(a) 패킷을 보낸다. 2) 서버는 클라이언트의 요청인 SYN(a)을 받고 클라이언트에게..

asfirstalways.tistory.com

 

'개발 > 지식' 카테고리의 다른 글

인프라 구성관리 툴  (0) 2020.04.10
[펌] 공룡책으로 정리하는 운영체제  (0) 2020.03.23
[펌] TCP 연결종료  (0) 2020.03.23
SSH vs SSL  (0) 2019.10.14
암달의 법칙 (Amdahl's Law)  (0) 2019.09.19