HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📖
공부한 책
/
1%의 네트워크 원리
1%의 네트워크 원리
/2장 TCP/IP의 데이터를 전기 신호로 만들어 보낸다/
서버에서 연결을 끊어 소켓을 말소한다 — close()

서버에서 연결을 끊어 소켓을 말소한다 — close()

데이터 보내기를 완료했을 때 연결을 끊는다연결 끊기 단계 (서버 측에서 먼저 연결 끊기 단계에 들어간다고 간주)소켓을 말소한다

데이터 보내기를 완료했을 때 연결을 끊는다

  • 데이터 송.수신을 종료하는 것은 애플리케이션이 송신해야 하는 데이터를 전부 송신 완료했다고 판단했을 때임
  • 어디에서 데이터 송.수신 동작이 끝나는지는 애플리케이션에 따라 다르다. ⇒ 프로토콜 스택은 어느 쪽에서 먼저 연결 끊기 단계에 들어가도 좋게 만들어져 있음
    • 예를 들어 웹이라면 클라이언트가 리퀘스트를 보내고 서버에서 응답을 주고 데이터 보내기를 완료함
    • 클라이언트 측이 데이터 보내기를 완료했다고 하는 식의 애플리케이션도 있음

연결 끊기 단계 (서버 측에서 먼저 연결 끊기 단계에 들어간다고 간주)

연결을 끊을 때의 대화 (TCP 4-way handshake)
연결을 끊을 때의 대화 (TCP 4-way handshake)
  • 서버측의 어플리케이션이 먼저 Socket 라이브러리의 close를 호출함
    • 서버측의 프로토콜 스택이 TCP 헤더를 만들고, 여기에 연결 끊기를 나타내는 정보를 설정함
      • 구체적으로 컨트롤 비트의 FIN에 1을 설정하고 IP 담당 부분에게 송신해달라고 의뢰
      • 이와 동시에 서버측의 소켓에 연결 끊기 동작에 들어갔다는 정보 기록
  • 서버에서 FIN에 1을 설정한 TCP 헤더가 도착하면 클라이언트 측의 프로토콜 스택은 자신의 소켓에 서버측이 연결 끊기 동작에 들어갔다는 것 기록 & ACK 번호 서버측에 반송( FIN 1 패킷 받았다고)
    • 이것이 끝나면 애플리케이션이 데이터를 가지러 올 때까지 기다림
  • 어플리케이션이 read를 호출하여 데이터를 가지러 오면, 데이터를 건네지 않고 서버에서 보낸 데이터를 전부 수신 완료했다는 사실을 클라이언트 측 애플리케이션에 알림(수신 버퍼에 있는 데이터 가져감) → 클라이언트 측 애플리케이션도 close 호출
    • FIN 비트에 1 설정한 TCP 헤더 만들고 IP 담당 부분에 의뢰하여 전송
    • 서버에서 ACK 번호 돌아오면 대화 끝

소켓을 말소한다

  • 서버와의 대화가 끝나면 소켓을 사용하여 서버와 대화할 수 없게 되어 소켓이 필요 없지만, 거기서 바로 소켓을 말소하지 않고 잠시 기다렸다 말소함
  • 그 이유 : 오동작을 막기 위해
    • 4-way handshake에서 마지막 ACK 번호를 송신하지 못한다면 다시 한번 FIN을 보내게 되는데 이 때 소켓이 말소되고 해당 포트에 새 소켓이 생기게 되면 그 새 소켓이 바로 연결 끊기 동작에 들어가 버릴 수도 있게 됨
  • 기다리는 시간은 패킷을 다시 보내는 동작과 관계 있음. 패킷이 없어졌을 때 다시 보내는 동작은 보통 몇 분쯤 계속되고, 몇 분이 경과하면 회복 전망이 없는 것으로 판단하여 다시 보내기 동작을 멈춤
    • 그 때까지의 시간 동안에는 다시 보낸 패킷이 네트워크에 존재할 가능성이 남아있으므로 다시 보내기 동작이 완전히 끝나는 시간만 기다리면 됨 (일반적으로 보통 몇분 기다리고 소켓 말소 )