준비도구
- kali linux — wireshark
- Telnet (ssh와 같은 통신 도구 그러나 암호화를 거치지 않고 통신함)
네트워크 상에서 이루어지는 TCP 연결과 데이터 전송 그리고 TCP 연결 종료를 집적 눈으로 볼 수 있는 기회는 많지 않다.
이번 글에서는 Kali Linux에서 WireShark를 이용해 통신 과정을 눈으로 확인해 본다.
1. TCP연결 수립 : 3‑handshake
- TCP 연결을 위해 클라이언트는 서버에 SYS flag가 담긴 패킷을 보낸다. 이 때 패킷의 순서 번호인 Seq는 랜덤으로 설정한다.
- SYS 패킷을 받은 서버는 클라이언트의 Seq + 1 을 ACK 에 넣고 SYS flag를 설정해서 응답한다.
- 클라이언트는 서버의 SYS 패킷을 응답받고 잘 받았다는 확인의 의미에서 ACK를 (서버가 보낸 패킷의 Seq + 1)으로 설정해서 응답한다.
- 이 과정을 거친 후 클라이언트와 서버는 TCP 연결 수립을 완료하게 된다. 첫번째 이미지에서 직접 패킷 내용을 확인해 볼 수 있다.
2. Server -> Client Data 전송
- 클라이언트는 마지막에 서버가 보낸 Seq 번호를 다시 한번 사용한다. 이는 세션을 의미하며, 이전 연결의 다음 통신을 의미한다.
- 클라이언트는 데이터의 크기를 패킷에 설정하고 보낸다.
- 서버는 패킷을 받고 [다음 ACK 응답 번호 + 데이터 크기]를 ACK에 설정하고 패킷을 보낸다.
4. TCP 연결 종료
- 서버는 클라이언트에 FIN flag가 담긴 패킷으로 연결종료 의사를 보낸다. 이 때 서버는 바로 연결을 종료하지 않는다.
- 클라이언트는 FIN flag가 담긴 패킷으로 응답패킷을 보낸다.
- 서버는 클라이언트의 FIN flag를 받고 연결을 종료한다.