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 |