CS/네트워크
3 Way-Handshake, 4 Way-Handshake
D_Helloper
2022. 12. 19. 19:22
3 Way-Handshake
3 Way-Handshake란?
- TCP에서 통신하는 장치 간에 서로 연결이 잘 되어 있는지 확인하는 과정, 방식
ㅎㅇ
TCP 프로토콜은 연결 지향적, 상대방이 내 신호를 받을 수 있는지 확인한 후에 통신을 시작 → 내 신호를 받을 수 있는지 확인할 때 3 Way-Handshake!
- TCP 표준에서는 Client가 먼저 3 Way-Handshake를 시작하기 때문에 Client를 Active Opener라고 표현, Server를 Passive Opener라고 표현
3 Way-Handshake 동작
- Client가 connect() System Call을 호출하여 Server에게 SYN Flag 전송 후 SYN_SENT로 Client의 State를 변경
- SYN_SENT 상태는 Server로부터 SYN+ACK Flag를 받거나 Timeout이 발생할 때 까지 유지
- bind(), listen() System Call을 호출하여 LISTEN 상태가 된 Server는 Client에게 SYN Flag를 받은 다음 accept() System Call을 호출하여 Client에게 SYN+ACK Flag를 전송하고 State를 SYN_RECEIVED로 변경
- SYN_RECEIVED 상태는 Client로부터 ACK Flag 또는 Data Packet을 수신하거나 Timeout이 발생할 때 까지 유지
- Client의 connect() System Call은 Server로부터 SYN+ACK Flag를 수신한 다음 종료, 이후에 Client는 Server에게 ACK Flag를 전송하고 상태를 ESTABLISHED로 변경
- send()/recv() System Call 호출을 통해 Server와 Data를 주고 받을 수 있음
- server의 accept() System Call은 Client로부터 ACK Flag를 수신하거나 SYN_RECEIVED의 Timeout에 의해서 종료
💥 Client가 SYN+ACK Flag의 응답으로 전송한 ACK Flag가 유실되면 ?
- Client가 전송하는 Data Packet 안에 ACK Flag 및 Sequence Number가 있음
- Server는 해당 내용을 가지고 Client가 수신을 잘 마쳤다는 것을 간접적으로 알 수 있음
- ACK Flag가 아닌 Data Packet을 수신해도 Server의 accept() System Call 호출은 종료되고 상태를 ESTABLISHED로 바뀜
함수 | 기능 |
---|---|
bind() | 생성된 소켓에 주소를 부여 |
listen() | 소켓에서 대기할 수 있는 연결 요청의 개수를 지정하는 역할, 소켓 활성화 |
accept() | 서버 프로그램에서 클라이언트의 연결 요청을 대기하는 역할 수행 |
connect() | 클라이언트 프로그램에서 서버에게 연결 요청을 수행 |
send() | 연결형 서비스에서 데이터를 송신하는 역할 |
recv() | 연결형 서비스에서 데이터를 수신하는 역할 |
TCP System Call : https://developer.ibm.com/articles/au-tcpsystemcalls/
4 Way-Handshake
4 Way-Handshake란?
- 3 Way-Handshake를 통해 안전하게 세션을 생성하고 데이터를 주고 받은 뒤 연결을 해제 하고자 할 때 사용
ㅂㅇ
- Client 뿐만 아니라 Server가 먼저 FIN Flag를 전송하여 4 Way-Handshake를 시작할 수 있음
- TCP 표준에서는 먼저 시작하는 쪽을 Active Closer라고 하며 반대쪽을 Passive CLoser라고 표현
4 Way-Handshake 동작
- Active Closer에서 close() System Call을 호출하거나 Activer Closer의 Process가 종료되면, Active Closer가 이용하던 Socket은 Close가 되고 FIN Flag를 상대방에게 전송 후 상태를 FIN_WAIT_1 상태로 변경
- Passive Closer로부터 ACK Flag를 받을 때 까지 유지
- FIN Flag를 받은 Passive CLoser는 ACK Flag를 전송하고 CLOSE_WAIT 상태로 변경
- Socket이 Close 될 때 까지 대기를 하는 상태를 의미
- Active CLoser와 동일하게 Passive Closer에서 close() System Call을 호출하거나 Passive CLoser의 Process가 종료되어 Socket이 Closer가 되기를 기다리는 상태
- Passive Closer의 Socket이 Close 되면 Passive Closer는 FIN Flag를 Active Closer에게 전송하고 LAST_ACK 상태로 변경
- Passive Closer의 ACK Flag와 FIN Flag를 받은 Active Closer는 FIN_WAIT_2 상태 및 TIME_WAIT 상태가 되며 특정 시간 이후에 CLOSE로 변경
- TIME_WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지하기 위해 사용, 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED 상태로 변경
3 Way-Handshake
A → B 들림?
B → A 들림, 너 들림?
A → B ㅇㅋ 들림
4 Way-Handshake
A → B 야 이제 가자
B → A ㅇㅋ 나 짐만 싸고
A 기다리는 중
B → A 나 다 쌈
A → B ㅇㅋ 가자
B는 강의실 밖으로 나가고 A는 강의실 정리를 마치고, 놓고 간 물건이 없는지 확인하고 불 끄고 나감