TCP 동작 과정
소켓 생성 -> 3 Way HandShake -> 데이터 송신, 수신 -> 4 Way HandShake
TCP 3-Way handshake
패킷 네트워크에서는 동시에 많은 상대방과 통신하므로 정확한 통신을 위해서는 통신 전, 각 통신에 필요한 리소스를 미리 확보하는 작업이 중요하다.
TCP에서는 3번의 패킷을 주고받으면서 통신을 서로 준비한다.
브라우저에서는 디스크립터와 요청을 보낸 서버 IP 주소를 넣어 요청을 호출하게 된다. 프로토콜 스택은 이 요청을 받아 웹서버로 요청을 보낸다.
3-Way handshake의 진행 상황에 따라 상태 정보를 부르는 이름이 다르다.
- LISTEN : 서버에서 서비스를 제공하기 위해 클라이언트의 접속을 받아들일 수 있는 상태(대기)
- SYN-SENT : 클라이언트에서 통신을 시도하기 위해 Syn 패킷을 보내는 상태
- SYN-RECEIVE : 클라이언트의 Syn을 받은 서버의 상태(Syn, Ack로 응답)
- ESTABLISHED : SYN-RECEIVE 상태에서 응답을 받은 클라이언트의 상태(서버와 클라이언트 간의 연결이 성공적으로 완료되었음을 나타냄)
TCP FLAG
어떤 패킷이 새로운 연결 시도이고, 기존 통신에 대한 응답인지 기존 통신과 새로운 통신을 구분하기 위해 헤더에 플래그(Flag)라는 값을 넣어 통신한다.
초기 연결, 응답, 정상 종료, 비정상 종료 등의 용도로 사용되며 통신의 성질을 나타낸다.
- SYN : 연결 시작 용도로 사용한다. 연결이 시작될 때 SYN 플래그에 1로 표시해 보낸다.
- ACK : ACK 번호가 유효할 경우, 1로 표시해 보낸다. 초기 SYN이 아닌 모든 패킷은 기존 메시지에 대한 응답이므로 ACK 플래그가 1로 표기된다.
- FIN : 연결 종료 시 1로 표시된다. 데이터 전송을 마친 후 정상적으로 양방향 종료 시 사용된다.
- RST : 연결 종료 시 1로 표시된다. 연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용된다.
- URG : 긴급 데이터인 경우, 1로 표시해 보낸다.
- PSH : 서버 측에서 전송할 데이터가 없거나 데이터를 버퍼링 없이 응용 프로그램으로 즉시 전달할 것을 지시할 때 사용한다.
example
- 통신을 처음 시도할 때 송신자는 플래그에 있는 SYN 필드를 1로 표기해 패킷을 보낸다. 이때 자신이 사용할 첫 seq no(시퀀스 번호)를 적어 보낸다.
- 이 SYN 패킷을 받은 수신자는 SYN과 ACK 비트를 플래그에 1로 표기해 응답한다. 자신이 보내는 첫 패킷이므로 SYN을 1로 표기하고 기존 송신자가 보냈던 패킷의 응답이기도 하므로 ACK 비트도 함께 1로 표기한다.
- 이때 자신이 사용할 시퀀스 번호를 적고 ACK 번호는 송신자가 보낸 시퀀스 번호에 1을 추가한 값을 넣어 응답한다. (ACK 번호는 10번까지 잘 받았으니 다음에는 10+1번을 달라는 의미)
- 수신자의 응답을 받은 송신자는 연결을 확립하기 위해 다시 한 번 응답 메시지를 보낸다.
- 이때부터는 기존 메시지의 응답이므로 ACK 필드만 1로 표기된다. 수신자가 ACK 번호를 20으로 표기해 보냈기 때문에 시퀀스 번호를 21로 표기해 응답한다.
- 동시에 수신자의 시퀀스 번호 20에 대한 응답이므로 ACK 번호를 21로 보낸다. (20번을 잘 받았으니 다음 시퀀스 번호를 보내달라)
TCP 4-Way handshake
논리적인 접속 상태를 해제(연결끊기)하기 위해 필요한 과정
4-Way handshake를 통해 서버와 클라이언트는 TCP 연결이 해제되며 연결을 위해 사용했던 리소스의 정리가 일어남
클라이언트에서 먼저 close() 를 호출하게 되면 TCP 헤더에 연결 끊기를 나타내는 FIN을 담아 보낸다. 그리고 FIN에 대한 응답이 서버에서 올 때까지 기다린다.