TCP 소켓이 생성되고 소멸하기까지 크게 나눠서 세 가지로 구분할 수 있습니다.
- 상대 소켓과 연결
- 상대 소켓과 데이터 송수신
- 상대 소켓과의 연결 종료
먼저 소켓과의 연결 과정입니다.
TCP 소켓은 연결 과정에서 총 세 번의 대화를 하는데, 이를 Three-way handshaking이라 합니다.
소켓은 전 이중 방식으로 동작하므로 양뱡향으로 데이터를 주고받을 수 있습니다. 따라서 데이터 송수신을 하기 이전에 준비가 필요한데, 먼저 연결요청을 하는 호스트 A가 B에게 [SEQ:1000 ACK:-]를 전달합니다.
여기서 SEQ 1000은 패킷의 번호가 1000이고, 잘 수신했다면 1001번 패킷을 전달하라고 말해달라는 뜻입니다.
처음 연결 요청에 사용되는 메시지여서 SYN(Synchronization), 동기화 메시지라고 합니다.
다음으로 호스트 B가 호스트 A에게 [SEQ:2000, ACK:1001]을 전달합니다. SEQ 2000은 앞과 같이 이 패킷의 번호가 2000이고 잘 수신했다면 2001번 패킷을 전달하라고 말해달라는 뜻입니다.
그리고 ACK 1001은 SEQ가 1000번인 패킷을 잘 수신했으니 다음 번엔 SEQ가 1001인 패킷을 전송해달라는 뜻입니다.
ACK는 응답메시지라는 뜻으로, 이 경우엔 SEQ와 ACK가 동시에 있으니 SYN+ACK라 합니다.
마지막으로 A가 B에게 [SEQ:1001, ACK:2001]을 전달하며 데이터 송수신 준비가 완료됩니다.
다음으로 상대 소켓과의 데이터 송수신 과정입니다.
위 그림은 호스트 A가 호스트 B에게 총 200바이트를 두 번에 나눠서 전송하는 과정입니다. 먼저 A가 100바이트의 데이터가 담긴 SEQ가 1200인 패킷을 보내는데, 이에 B는 잘 수신했다는 의미로 ACK 1301 패킷을 보냅니다. 1201이 아닌 1301인 이유는 데이터가 100바이트이기 때문이고, 이로써 데이터가 손실됐는지 전부 전송됐는지를 알 수 있습니다.
마지막에 1을 더한 이유는 다음 번헤 전달될 SEQ의 번호를 알리기 위해서입니다.
따라서, ACK 번호는 SEQ번호+전송된 바이트 크기+1과 같습니다.
위 그림은 패킷이 소멸되는 상황입니다.
패킷이 전송되고 일정 시간 안에 전송된 패킷에 대한 ACK 메시지를 받지 못할 경우, 재전송을 진행하게 됩니다.
다음은 상대 소켓과 연결을 종료하는 과정입니다.
연결을 끊을 때 만약 상대방이 전송할 데이터가 남아있으면 문제가 생기기때문에 상호간에 연결종료의 과정을 거쳐야합니다. 패킷에 담겨있는 FIN은 종료를 알리는 메시지입니다. 즉 상호간에 FIN 메시지를 한번씩 주고 받고 연결이 종료되게 됩니다. 이 과정이 네 단계에 걸쳐서 진행되기에 이를 Four-way handshaking이라 합니다.
이 과정에서 B가 A에게 같은 번호를 가진 ACK 패킷을 2개 보내게 되는데, 이는 앞서 ACK 패킷을 보내고 데이터 수신이 없어 재전송 된 것입니다.
'현생 > TCP 소켓 프로그래밍' 카테고리의 다른 글
6-2. UDP 기반 간단한 서버와 클라이언트 구현 [UDP/IP][C][LINUX] (0) | 2022.01.18 |
---|---|
6-1. UDP 소켓의 특성 [UDP/IP] (0) | 2022.01.18 |
5-2 TCP 소켓의 입출력 버퍼 [TCP/IP] (0) | 2022.01.17 |
5-1. 간단한 계산기 서버와 클라이언트 구현 [TCP/IP][C][LINUX] (0) | 2022.01.17 |
4-2. echo 서버와 클라이언트 구현 [TCP/IP][C][LINUX] (0) | 2022.01.15 |