1. 연결 설정
첫 번째로 클라이언트(A)가 서버(B)에게 연결을 요청하는 패킷을 보낸다. 이러한 패킷을 SYN이라고 하며, 이 패킷 안에는 SEQ와 ACK라는 정보가 들어있다. SEQ는 패킷의 번호이며, ACK는 다음에 받길 기대하는 패킷의 번호이다. SEQ와 ACK의 쓰임은 데이터의 수신 유무를 확인하기 위한 것이다.
두 번째로 서버가 클라이언트에게 패킷을 잘 받았고, 연결요청을 수락하는 패킷을 보낸다. 이러한 패킷을 SYN+ACK 메세지라 칭하며, SEQ에 2000이라는 넘버를 부여하고, 전에 받은 패킷번호에서 +1을 하여서 다음에 받을 패킷의 번호를 설정하여 ACK를 같이 보낸다.
세 번째로 클라이언트가 서버에게 패킷을 잘 받았고, 데이터를 송수신 하자는 패킷을 보낸다. 받은 패킷의 번호가 2000이었으니 ACK로 다음에 받을 패킷의 번호가 2001이라는것과 현재 보내는 패킷이 전에 보낸 패킷의 다음 패킷이라는 의미의 1001이라는 번호로 SEQ에 설정하여 보낸다.
이러한 단계를 three way handshanking라고 한다. 세번 악수를 의미했다는 말이다. 또한 이 단계는 connect()를 호출함과 동시에 시작이 된다.
2.데이터 송수신
처음에 A가 B에게 데이터 패킷을 보냈다. 이 패킷은 번호가 1301이고, 크기는 100바이트 이다. 그럼 B는 데이터를 잘 받았는지 ACK메세지를 보낸다. ACK메세지는 ACK정보가 1401을 보내는데 이 1401의 의미는 받은 패킷의 번호에다가 받은 데이터의 크기를 더해서, 다음의 받을 패킷번호를 보낸다. 그리고 왜 수신된 데이터의 크기를 계산하여 ACK메세지를 보내는가 하면, 이유는 데이터를 받았다는 수신 확인 메세지는 될지 몰라도 A가 100바이트를 보낸 것이 B에게 그대로 갔는지 확인하기 위해서 받은 데이터의 크기만큼 계산하여 보내는 것이다. 그래서 1401이다.
두 번째 패킷을 보내는데 B가 ACK로 1401을 보냇으므로 두 번째 보내는 패킷은 SEQ로 1401을 설정하고, 또 100바이트를 보내고 있다. 하지만 두 번째 패킷은 중간에 손실이 일어났다. A는 B가 잘 받았다는 ACK메세지를 보내야 하는데, 안보내므로 다시 보낸다. 이 때 다시 보내는 기준은 time out시간이다. 이시간동안 ACK메세지가 안오면 다시 보낸다.
3.연결 종료
처음에 A가 B에게 연결을 종료하자는 의미의 패킷을 보낸다. 이때 SEQ는 5000이고 ACK는 비어있다. 이러한 패킷을 FIN이라고 한다. 그럼 B는 연결 종료 패킷을 보내는것이 아니라, 단순히 ACK메세지만 보낸다. 아직 B는 종료할 상황이 아닐수도 있다. B가 아직 데이터 전송할게 남아있을 경우를 예로 들 수 있다.
B에서 종료할 상황이 되면 FIN메세지를 A에게 보내준다. 그럼 A 또한 ACK메세지를 보내 잘 받았다는 메세지를 B에게 보내준다. 그럼 이후에 연결이 종료가 된다.
이러한 종료 단계는 네 단계에 걸쳐 진행이 되므로 four way handshaking이라고 한다.
'네트워크' 카테고리의 다른 글
패킷 구성요소 (0) | 2019.02.13 |
---|---|
netstat 상태값 정리 (0) | 2019.02.13 |
TCP와 UDP의 차이점 (0) | 2019.02.13 |