연결 끊기(소켓 말소)
프로토콜 스택은 어느 쪽에서 먼저 연결 끊기 단계에 들어가도 좋게 만들어져 있으나, 보통 웹이라면 서버측이 연결 끊기 단계에 들어간다.
서버측
- 서버측 프로토콜 스택이 TCP 헤더를 만들고 연결 끊기를 나타내는 정보를 설정한다.
- 컨트롤 비트의 FIN 비트를 1로 설정
- IP 담당 부분에 클라이언트에 송신해달라 요청한다.
- 서버 측의 소켓에 연결 끊기 동작에 들어갔다는 정보를 기록한다.
클라이언트측
- 서버에서 FIN에 1를 설정한 TCP 헤더가 도착한다.
- 클라이언트 프로토콜 스택은 자신의 소켓에 서버측이 연결 끊기 동작에 들어갔다는 것을 기록한다.
- FIN을 1로 설정한 패킷을 받은 것을 알리기 위해 ACK 번호를 서버측에 반송한다.
- 애플리케이션이 데이터를 가지러 올 때까지 기다린다.
- 애플리케이션이 read 를 호출해서 데이터를 가지러 온다.
- 데이터를 건네지 않고, 서버에서 보낸 데이터를 전부 수신완료 했다는 사실을 애플리케이션(브라우저)에게 알린다.
- 서버에서 보낸 데이터를 전부 수신 완료하면 클라이언트도 종료한다.
소켓 말소
서버와 대화가 끝나도 바로 소켓을 말소하지 않고 잠시 기다린 후 소켓을 말소한다. (오동작 방지)
오동작 예
- 클라이언트가 FIN 송신
- 서버가 ACK 번호 송신
- 서버가 FIN 송신
- 클라이언트가 ACK 번호 송신
→ 여기에서 서버가 ACK 번호가 돌아오지 않으니 다시 한 번 FIN을 보낼 수도 있다. 이 때 소켓을 말소하면 소켓에 할당되어 있던 포트 번호를 알 수 없음으로 다른 애플리케이션이 소켓을 작성하면 새 소켓에 같은 포트 번호가 할당될 가능성이 있다.
일반적으로 보통 몇 분 기다리고 나서 소켓을 말소한다.
정리
- 소켓 작성
- 클라이언트가 서버를 향해 접속 동작을 실행한다.
- 데이터 송수신을 한다. 웹의 경우 클라이언트에서 서버에 리퀘스트 메시지를 보낸다.
- TCP는 이것을 적당한 크기의 조각으로 분할해서 TCP 헤더를 맨 앞에 부가, 서버에 보낸다. 시퀀스 포함
- 서버는 ACK 번호를 클라이언트에 반송한다.
- 애플리케이션에 데이터를 건네주어 수신 버퍼에 빈 영역이 생기면, 윈도우의 값도 기록하여 클라이언트에게 통지한다.
- 클라이언트에게 리퀘스트 메시지를 보내면 서버가 응답 메시지를 반송한다. 이 때의 작업을 앞의 설명과 반대가 된다.
- 연결 끊기 동작을 한다. 웹의 경우 서버에서 연결을 끊는다.
- FIN을 1로 만든 TCP 헤더가 흐른다.
- ACK 번호의 TCP 헤더가 돌아온다.
- 역방향으로 FIN 을 1로 만든 TCP 헤더와 ACK 번호의 TCP 헤더가 흐른다.
- 잠시 후 소켓이 말소된다.
728x90
'개발공부 개발새발 > Network' 카테고리의 다른 글
Network ) UDP Protocol (0) | 2023.07.27 |
---|---|
Network ) 이더넷 (0) | 2023.07.27 |
Network) 데이터 송수신 (0) | 2023.07.27 |
Network) 서버에 접속하자! (0) | 2023.07.26 |
Network) Protocol Stack (0) | 2023.07.25 |