STORY 04 서버에서 연결을 끊어 소켓을 말소한다
1. 데이터 보내기를 완료했을 때 연결을 끊는다
- 더이상 송수신할 데이터가 없을 경우 연결을 끊는다.
- 일반적으로 웹서버와의 통신의 경우 웹서버에서 더이상 송신할 데이터가 없을 경우 연결을 끊는다.
- 경우에 따라 처음 데이터를 송신하는 어플리케이션(클라이언트) 측에서 연결을 종료하는 경우도 있다.
- 클라이언트와 서버 둘 중 한곳에서 연결을 끊으면 통신 연결이 종료된다.
- 웹 서버 기준으로 더이상 송신할 데이터가 없으면 서버는 Socket 라이브러리의 close() 를 호출한다.
- 서버측의 프로토콜 스택은 TCP 헤더를 만들고 TCP 헤더에 FIN 컨트롤비트를 1로 설정한다.
- IP 담당 부분에 클라이언트에게 송신하도록 의뢰한다.
- 클라이언트는 종료 메시지를 수신하고 서버에게 응답한다.
- FIN 에 1을 설정한 TCP 헤더가 도착하면 해당 내용을 소켓에 기록한다.
- 제대로 응답을 받았다고 알리기 위해 서버에게 ACK 번호를 응답한다.
- 어플리케이션은 서버에서 받은 데이터를 읽기 위해 read() 를 호출한다.
- 종료 메시지를 받았을 경우 수신 버퍼에 남아있는 데이터만 넘긴다.
- 프로토콜 스택은 서버에서 종료 메시지를 보냈다는 내용을 어플리케이션에게 알린다.
- 클라이언트 측의 어플리케이션도 종료하기 위해 Socket 의 close() 를 호출한다.
- 서버 동작과 동일하게 TCP 헤더에 FIN 을 1로 설정 후 서버에게 송신한다.
- 서버에서 ACK 번호가 돌아오면 서버와의 통신이 종료된다.
2. 소켓을 말소한다
- 통신 연결을 종료하더라도 클라이언트와 서버 측에서는 각각의 소켓이 남아있다.
- 소켓은 오동작을 막기 위해 바로 제거하는 것이 아닌 일정 시간이 지난 후 말소한다.
- 클라이언트 FIN 송신 → 서버 ACK 송신 → 서버 FIN 송신 → (네트워크 문제 발생) → 클라이언트 ACK 송신
- 서버가 FIN 송신 후 네트워크 문제가 발생하여 ACK 를 수신하지 못할 경우 서버는 FIN 을 재송신한다.
- 이때 클라이언트의 소켓이 말소되어 있으면 어느 소켓에게 온 요청인지 알 수 없다.
- 심지어는 말소 후 동일한 포트번호를 가지는 소켓이 새로 생성되었다면, 새로 생성된 소켓에게 종료 요청이 올 수도 있다.
- 소켓은 재송신 동작을 포함하여 모든 동작이 완전히 끝나는 시간을 기준으로 대략 분단위의 시간을 기다린 후 말소한다.
3. 데이터 송수신 동작을 처리한다
- 데이터 송수신 동작의 모든 과정을 정리한다.
- 소켓을 작성한다.
- 서버측에서 어플리케이션이 동작할 때 소켓을 만들고 접속 대기 상태로 설정한다.
- 클라이언트 측에서 서버와의 연결을 위해 소켓을 생성한다.
- 서버에 접속한다.
- 클라이언트가 SYN 이 1인 TCP 헤더를 만들어 서버에게 보낸다.
- TCP 헤더에는 시퀀스 번호의 초기값도 포함되어 있다.
- 서버에서 클라이언트에 데이터를 송신할 때 이용하는 윈도우 값도 포함되어 있다.
- 서버도 SYN 이 1인 TCP 헤더를 만들어 클라이언트에게 보낸다.
- TCP 헤더에는 클라이언트와 마찬가지로 시퀀스 번호 초기값과 윈도우가 포함되어 있다.
- ACK 번호도 포함되어 있다.
- 클라이언트도 ACK 번호가 포함된 요청을 서버에게 보낸다.
- 데이터를 송수신한다.
- 웹 서버의 경우 클라이언트는 서버에 리퀘스트 메시지를 보낸다.
- 데이터를 적절한 크기로 분할하여 TCP 헤더를 붙인 후 보낸다.
- TCP 헤더에는 분할된 데이터가 몇번째 바이트부터 시작되는지 나타내는 시퀀스 번호가 포함되어 있다.
- 서버는 ACK 번호가 포함된 요청을 클라이언트에게 반송한다.
- 수신 버퍼의 변화가 있을 경우 수용 가능한 윈도우 크기도 포함되어 있다.
- 서버는 클라이언트에게 데이터를 송신한다.
- 클라이언트의 요청과 마찬가지로 패킷단위로 분리하며 시퀀스 번호를 포함하여 송신한다.
- 클라이언트는 ACK 번호를 반송한다.
- 통신은 양방향이므로 클라이언트 측에서도 수용 가능한 윈도우 크기를 포함하여 전송한다.
- 소켓 통신 연결을 종료한다.
- 웹 서버의 경우 서버에서 FIN 이 1인 TCP 헤더를 보낸다.
- 클라이언트는 ACK 번호를 보내 정상응답을 회답한다.
- 클라이언트 측에서도 연결을 종료하기 위해 FIN 이 1인 TCP 헤더를 보낸다.
- 서버도 ACK 번호를 보내 연결을 종료한다.
STORY 05 IP 와 이더넷의 패킷 송수신 동작
1. 패킷의 기본
- 패킷은 헤더와 데이터 두 부분으로 구성되어 있다.
- 헤더에는 패킷의 제어 정보가, 데이터는 실제 데이터가 포함되어 있다.
- IP 의 패킷 : IP 헤더 + (TCP 헤더 + 데이터 조각)
- 이더넷의 패킷 : MAC 헤더 + (IP 헤더 + (TCP 헤더 + 데이터 조각))