0. TCP
- TCP는 전송 계층(Transport Layer)에서 사용되는 프로토콜이다.
- 장치들 사이에 논리적인 접속을 성립(Establish)하기 위하여 연결을 설정
- 높은 신뢰성을 제공하고 연결 지향성 서비스를 제공한다.
- 정보 전달에 있어 안정적으로, 순서대로, 에러 없이 데이터를 교환을 목적으로 한 프로토콜
- 위의 안정적이고 논리적인 특징을 만족하기 위해 TCP의 경우 handshake를 사용한다.
1. TCP의 3 way-handshake
1-1. TCP의 3 way-handshake 역할
- 3 way-handshake는 TCP 통신을 이용해 데이터 전송 전 정확한 전송을 보장하기 위해 사전에 세션을 수립하는 과정
- 클라이언트와 서버 모두 데이터를 전송하고 받을 준비가 되었다는 것을 보장한다.
- 실제로 데이터 전달이 시작되기 전에 한쪽에서 다른 쪽이 준비되었다는 것을 알 수 있다.
1-2. 플래그 정보
- 3 way-handshake의 플래그 정보는 SYN, ACK, FIN 3가지가 있다.
- SYN (Synchronize Sequence Number)
- 연결 설정을 나타내는 플래그
- TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷
- Sequence Number를 랜덤으로 설정하여 세션을 연결하는데 사용하며, 초기 Sequence Number를 전송한다.
- ACK (Acknowledgement)
- 응답 확인을 나타내는 플래그
- 상대방으로부터 패킷을 받았다는 것을 알려주는 패킷
- Acknowledgement Number 필드가 유효한지 나타낸다.
- 클라이언트가 보내는 SYN 패킷 이후 전송되는 모든 패킷은 이 플래그가 설정되어야 한다.
- 양단 프로세스가 쉬지 않고 데이터를 주고 받는다면, 최초 연결 설정 과정에서 전송되는 첫번째 세그먼트를 제외한 모든 세그먼트의 ACK 비트는 1로 지정한다고 생각하자.
- FIN (Finish)
- 연결 해제를 나타내는 플래그
- 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미
1-3. 포트 상태 정보
- 3 way-handshake의 포트 상태는 CLOSED, LISTEN, SYN_SENT, SYN_RECEIVED, ESTABLISHED 5가지가 있다.
- CLOSED : 포트가 닫힌 상태
- LISTEN : 포트가 열린 상태로 연결 요청 대기 상태
- SYN_SENT : SYN 요청을 한 상태
- SYN_RECEIVED : SYN 요청을 받고 상대방의 응답을 기다리는 상태
- ESTABLISHED : 포트 연결 상태
1-4. TCP의 3 way-handshake 동작 과정
- SYN (Client → Server)
- 서버에 접속을 요청하는 SYN 패킷을 전송한다.
- 송신자가 최초로 데이터를 전송할 때, 시퀀스 넘버를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다.
- 클라이언트는 SYN 패킷을 전송한 뒤, SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
- SYN/ACK (Server → Client)
- LISTEN 상태인 서버가 SYN 패킷을 받고 클라이언트에게 요청을 수락(ACK)하며 접속 요청 프로세스인 클라이언트의 포트를 열어달라는 메시지(SYN)를 전송한다.
- ACK Number 필드를 "시퀀스 넘버 + 1" 로 지정하고, SYN과 ACK 플래그 비트를 1로 설정한 세그먼트 전송한다.
- SYN 패킷을 받은 서버는 SYN_RECEIVED 상태가 된다.
- ACK (Client → Server)
- 클라이언트는 서버의 응답을 받았다는 의미로, ACK Number 필드를 "시퀀스 넘버 + 1"로 지정하고, 서버로 ACK 플래그가 설정된 세그먼트를 전송한다.
- ACK 요청을 보낸 클라이언트는 ESTABLISHED 상태가 된다.
- ACK 요청을 받은 서버는 ESTABLISHED 상태가 된다.
1-5. 3 way-handshake 사용 이유
- TCP는 연결 지향적 프로토콜로 안정적인 데이터 전송을 위해 신뢰성을 확보하는데 중점을 둠
- TCP는 양방향 통신이기 때문에 양쪽 모두 상대방에게 패킷을 보낼 수 있는지 확인
- 클라이언트와 서버 모두 한 번씩 SYN 와 ACK를 주고받으며 데이터 수신 여부를 확인 논리적으로 총 네 단계가 필요한데, 서버의 SYN + ACK를 한 단계로 축약하여 세 단계를 가짐
2. TCP의 4 way-handshake
2-1. TCP의 4 way-handshake 역할
- 위의 3 way-handshake의 역할이 안정적인 세션을 수립하는 과정이었다면, 4 way-handshake는 세션을 안정적으로 종료하기 위한 과정이라고 생각할 수 있다.
- 즉, 4 way-handshake는 TCP 통신 연결을 단계적으로 해제하는 과정이다.
2-2. 포트 상태 정보
- 4 way-handshake의 포트 상태는 FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2,LAST_ACK, TIME_WAIT 5가지가 있다.
- FIN_WAIT1 : Close()를 호출 후 FIN 패킷을 보내고 응답을 대기하는 상태
- CLOSE_WAIT : 종료 요청을 받고 진입하는 상태로 남은 데이터가 있다면 전송을 마친 후 Close() 호츨
- FIN_WAIT2 : 종료를 준비한다는 응답을 받고 종료 요청이 올 때 까지 대기하는 상태
- LAST_ACK : 모든 데이터를 보내고 FIN 패킷을 전송한 후 상대방의 응답을 대기하는 상태
- TIME_WAIT : FIN 패킷을 받은 후 다시 ACK 응답을 한 이후의 상태로, 의도치 않은 에러로 인해 연결이 데드락에 빠지는 것을 방지한다.
2-3. TCP의 4 way-handshake 과정
- FIN (Client → Server)
- close() 가 호출되면 연결을 종료하겠다는 FIN 패킷을 전송한다.
- FIN 패킷에는 ACK가 포함되어 있다.
- FIN 패킷을 보낸 후 클라이언트는 FIN_WAIT1 상태가 된다.
- ACK (Server → Client)
- FIN 패킷을 받은 서버는 응답 패킷 ACK를 보낸다.
- 아직 남은 데이터가 있다면 전송을 모두 마친 뒤 close()를 호출한다.
- 응답 패킷 ACK를 보낸 후 서버는 CLOSE_WAIT 상태가 된다.
- 응답 패킷 ACK를 받은 후 클라이언트는 FIN_WAIT2 상태가 된다.
- FIN (Server → Client)
- 2번에서 남은 데이터를 모두 보낸 뒤, 서버는 FIN 패킷을 클라이언트에게 보낸 후 클라이언트가 승인 번호를 보내줄 때 까지 기다리는 LAST_ACK 상태가 된다.
- ACK (Client → Server)
- 클라이언트는 FIN 패킷을 받고 확인이 완료되었다는 ACK 응답을 보낸다.
- ACK 응답을 보낸 후 클라이언트는 TIME_WAIT 상태가 된다.
- 이때, TIME_WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락에 빠지는 것을 방지한다.
- 만약 에러로 인해 종료가 지연되다가 시간 초과가 발생하면 CLOSED 상태로 돌아간다.
- 서버는 ACK 패킷을 받은 후 소켓을 닫는다. (CLOSED)
3. TCP에서 3 way-handshake / 4 way-handshake 의미
- 결론적으로 3 way-handshake는 TCP의 연결 과정을 의미하고, 4 way-handshake는 TCP의 연결 해제 과정을 의미한다.
- 이렇게 3 way-handshake, 4 way-handshake를 통해 TCP 통신은 안정적이고 순서대로, 논리적으로 데이터를 주고 받을 수 있다.
'CS 지식 > 네트워크(Network)' 카테고리의 다른 글
[Network] TCP/UDP (0) | 2024.07.17 |
---|