TCP는 신뢰성 있는 연결을 하는 프로토콜입니다.
UDP랑 다르게 연결을 시작할 때도 복잡한 과정을 거칩니다.
연결을 시작하기전에, 송신/수신의 상태를 확인하는 과정이 필요합니다.
2-way handshake
TCP 연결을 수립하는 방법 중 하나입니다.
클라이언트에서 연결을 하고싶다고 제안하면, 서버 측에서 승낙하는 방식입니다.
동작 방식
- 클라이언트가 서버에게 연결을 요청합니다.
- 이때 Headr의 SYN bit를 1로 설정하여 보냅니다.
- 서버가 연결이 가능할 경우, 클라언트에게 응답을 보냅니다.
- TCP header의 ACK,SYN bit를 1로 설정하여 보냅니다.
- 클라이언트가 서버로 부터 받은 ACK 패킷과, SYN 패킷을 확인하고, 데이터를 전송합니다.
설명의 편의를 위해서 왼쪽을 A, 오른쪽을 B라고 하겠습니다.
위 그림은 A가 B에게 요청을 했지만, 요청 응답이 많이 딜레이가 되어 재 연결 요청하는 상황입니다.
이 경우 B는 과거의 연결 요청에 대한 순서 번호로 응답을 했지만, 재전송 이후에 그 응답이 왔고, A는 재전송에 대한 응답패킷이 아니기에, B의 응답 패킷을 버리게 됩니다.
B입장에서는 A가 내 응답을 제대로 받았는지 확인할 수 없기에, B혼자 연결된 상황입니다.
TCP 프로토콜의 특징중 하나인 양방향 연결성인데, 이런 경우는 통신의 신뢰성을 보장할 수 없습니다.
이러한 문제점을 해결하기 위해 3-way handshake가 등장했습니다.
3-Way Handshake
연결 시작
- 클라이언트가 TCP 프로토콜에서 연결하자는 의미로 SYN패킷(SYN bit 와 seq num(순서 번호))를 서버에게 보낸다.
- 서버는 클라이언트의 seq num(순서 번호)가 X인 것을 알게 되고, 클라이언트에게 Syn, ACK가 합쳐진 패킷을 보내면서, 자신의 seq num이 Y임을 가르쳐줌.
- 여기서 보내는 ACK는 클라이언트의 seq num +1로 설정한다.
- 클라이언트는 서버로부터 잘 받았다는 의미로 ACK를 보낸다.
- 여기서 보내는 ACK는 서버의 seq num + 1로 설정한다.
연결을 종료
연결을 종료 할 때도 핸드셰이크 과정이 필요하다.
한쪽이 일방적으로 연결을 끊어 버리면, 통신의 신뢰성이 떨어지기 때문입니다.
- 클라이언트가 연결 종료를 하자는 FIN 패킷을 서버에게 보냅니다.
- 서버는 응답으로 ACK 패킷을 클라이언트에게 보냅니다.
- 여기서 ACK를 보내는 의미는 나 이제 데이터 안 받을 거야~~
- 그리고 서버에서 보낼 데이터가 있다면, 데이터를 모두 전송합니다.
- 서버가 모든 데이터 전송을 마친 후, FIN을 클라이언트에게 보냅니다.
- 나도 이제 데이터 안 보낼거야~~ 라는 의미입니다.
- 클라이언트는 FIN 패킷을 받고, 연결을 종료하기 위해 ACK 패킷을 서버에게 보냅니다.
- 서버는 ACK 패킷을 받고, 연결을 종료합니다.
이 과정에서 양측은 서로에게 Fin 패킷과 ACK 패킷을 전송하여 연결을 종료하기에, 4-way hadnshake라고도 합니다.
😀요약
- TCP는 신뢰성 있는 통신을 지향하기에, 데이터를 교환하기 전 송신/수신 상태를 확인하는 과정이 있다.
- 2- way handshake 방식은 특정한 경우, 양방향 연결이 되지 않기에, 신뢰성을 보장할 수 없다.
- 3-way handshake 방식은 연결을 시작할 때 사용한다.
- 4-way handshake 방식은 연결을 종료할 때 사용한다.
'Computer Science > Network' 카테고리의 다른 글
[컴퓨터망] - TCP congestion control (1) | 2023.04.15 |
---|---|
[컴퓨터망] - principles of congestion control (0) | 2023.04.14 |
[컴퓨터망]- TCP flow control (0) | 2023.04.14 |
[컴퓨터망] - TCP 네놈이 뭔데? (0) | 2023.04.14 |
[컴퓨터망] - Rdt,pipeline, Go-Back-N, Selective Repeat (2) | 2023.04.13 |