본문 바로가기

리눅스 커널/네트워크

TCP Handshake

1. 3-way handshaking

 

주로 초기 연결 시 사용되는 메커니즘이다.

-----------------------------------------------------------------------------------------------------

(1) Client------(SEQ: 1000)------>Server

    클라이언트가 서버로 SYN: 1이 설정된 TCP 패킷을 보내어 연결 요청을 함

------------------------------------------------------------------------------------------------------

(2) Client<------(SEQ: 2000, ACK: 1001)------Server

    서버가 클라이언트로 SYN: 1, ACK: 1이 설정된 TCP패킷을 보내어 연결 요청을 수락하였음을 알림

-------------------------------------------------------------------------------------------------------

(3) Client------(SEQ: 1001, ACK: 2001)------->Server

    클라이언트가 서버로 ACK: 1이 설정된 TCP패킷을 보내어 해당 패킷을 잘 받았음을 알림

-----------------------------------------------------------------------------------------------------------

2. 데이터 송수신

-----------------------------------------------------------------------------------------------------

(1) Client------(SEQ: 1200 with 100bytes data)------>Server

    클라이언트가 서버로 100바이트 짜리 5계층 데이터를 전송함

------------------------------------------------------------------------------------------------------

(2) Client<------(ACK: 1301)------Server

    서버가 클라이언트로 100바이트 데이터는 잘 받았음을 알림

-------------------------------------------------------------------------------------------------------

(3) Client------(SEQ: 1301 with 100bytes data)------->Server

    클라이언트가 서버로 100바이트 짜리 5계층 데이터를 전송함, 이때 이전 ACK로 인해 SEQ가 바뀜

-----------------------------------------------------------------------------------------------------------

(4) Client<------(ACK: 1401)------Server

    서버가 클라이언트로 100바이트 데이터는 잘 받았음을 알림

---------------------------------------------------------------------------------------------------------

 

여기서 ACK번호 = SEQ번호 + 1 임을 볼 수 있는데, 이른 다른 의미로는 지금 받은 데이터의 다음 데이터에 대한 SEQ번호로 생각하면 된다.

3. 4-way handshaking

 

주로 연결 종료 시 사용되는 메커니즘이다.

-----------------------------------------------------------------------------------------------------

(1) Client------(SEQ: 5000)------>Server

    클라이언트가 서버로 FIN: 1이 설정된 TCP 패킷을 보내어 연결 해제를 요청을 함

------------------------------------------------------------------------------------------------------

(2) Client<------(SEQ: 7500, ACK: 5001)------Server

    서버가 클라이언트로 ACK: 1이 설정된 TCP패킷을 보내어 연결 해제 요청을 받았음을 알림

-------------------------------------------------------------------------------------------------------

(3) Client<------(SEQ: 7501, ACK: 5001)------Server

    서버가 클라이언트로 FIN: 1이 설정된 TCP패킷을 보내어 연결 해제를 알림

-------------------------------------------------------------------------------------------------------

(3) Client------(SEQ: 5001, ACK: 7502)------->Server

    클라이언트가 서버로 ACK: 1이 설정된 TCP패킷을 보내어 연결 해제를 받았음을 알림

-----------------------------------------------------------------------------------------------------------

위 세가지 경우에 대해서 ACK가 유실되는 경우는 따로 고려하지 않았는데,

ACK가 유실되는 경우는 ACK를 못받은 호스트가 ACK를 받을 때 까지 이전에 보낸 패킷을 재전송한다.

 

그래서 연결 종료의 경우

FIN 패킷을 먼저 보낸 호스트가 Time-wait 상태를 거친 후 사용한 자원을 반환하게 되는데,

위 경우에서 서버가 마지막 ACK 패킷을 못받으면 다시 이전 패킷을 보내게 되고, 클라이언트가 이를 처리하느라 소켓의 자원해제가 늦어질 수 있다.



'리눅스 커널 > 네트워크' 카테고리의 다른 글

Wireless packet capture  (0) 2021.10.24
Check Sum Layer 4  (0) 2021.10.24
netlink example  (0) 2021.10.24
promiscuous mode  (0) 2021.10.24
DHCP  (0) 2021.10.24