본문 바로가기
개발공부 개발새발/Network

Network) 연결 끊기와 데이터 송수신 요약

by 휴일이 2023. 7. 27.

연결 끊기(소켓 말소)

프로토콜 스택은 어느 쪽에서 먼저 연결 끊기 단계에 들어가도 좋게 만들어져 있으나, 보통 웹이라면 서버측이 연결 끊기 단계에 들어간다.

서버측

  1. 서버측 프로토콜 스택이 TCP 헤더를 만들고 연결 끊기를 나타내는 정보를 설정한다.
    1. 컨트롤 비트의 FIN 비트를 1로 설정
  2. IP 담당 부분에 클라이언트에 송신해달라 요청한다.
  3. 서버 측의 소켓에 연결 끊기 동작에 들어갔다는 정보를 기록한다.

클라이언트측

  1. 서버에서 FIN에 1를 설정한 TCP 헤더가 도착한다.
  2. 클라이언트 프로토콜 스택은 자신의 소켓에 서버측이 연결 끊기 동작에 들어갔다는 것을 기록한다.
  3. FIN을 1로 설정한 패킷을 받은 것을 알리기 위해 ACK 번호를 서버측에 반송한다.
  4. 애플리케이션이 데이터를 가지러 올 때까지 기다린다.
  5. 애플리케이션이 read 를 호출해서 데이터를 가지러 온다.
  6. 데이터를 건네지 않고, 서버에서 보낸 데이터를 전부 수신완료 했다는 사실을 애플리케이션(브라우저)에게 알린다.
  7. 서버에서 보낸 데이터를 전부 수신 완료하면 클라이언트도 종료한다.

소켓 말소

서버와 대화가 끝나도 바로 소켓을 말소하지 않고 잠시 기다린 후 소켓을 말소한다. (오동작 방지)

오동작 예

  1. 클라이언트가 FIN 송신
  2. 서버가 ACK 번호 송신
  3. 서버가 FIN 송신
  4. 클라이언트가 ACK 번호 송신

→ 여기에서 서버가 ACK 번호가 돌아오지 않으니 다시 한 번 FIN을 보낼 수도 있다. 이 때 소켓을 말소하면 소켓에 할당되어 있던 포트 번호를 알 수 없음으로 다른 애플리케이션이 소켓을 작성하면 새 소켓에 같은 포트 번호가 할당될 가능성이 있다.

일반적으로 보통 몇 분 기다리고 나서 소켓을 말소한다.

정리

  1. 소켓 작성
  2. 클라이언트가 서버를 향해 접속 동작을 실행한다.
  3. 데이터 송수신을 한다. 웹의 경우 클라이언트에서 서버에 리퀘스트 메시지를 보낸다.
    1. TCP는 이것을 적당한 크기의 조각으로 분할해서 TCP 헤더를 맨 앞에 부가, 서버에 보낸다. 시퀀스 포함
    2. 서버는 ACK 번호를 클라이언트에 반송한다.
    3. 애플리케이션에 데이터를 건네주어 수신 버퍼에 빈 영역이 생기면, 윈도우의 값도 기록하여 클라이언트에게 통지한다.
    4. 클라이언트에게 리퀘스트 메시지를 보내면 서버가 응답 메시지를 반송한다. 이 때의 작업을 앞의 설명과 반대가 된다.
  4. 연결 끊기 동작을 한다. 웹의 경우 서버에서 연결을 끊는다.
    1. FIN을 1로 만든 TCP 헤더가 흐른다.
    2. ACK 번호의 TCP 헤더가 돌아온다.
    3. 역방향으로 FIN 을 1로 만든 TCP 헤더와 ACK 번호의 TCP 헤더가 흐른다.
    4. 잠시 후 소켓이 말소된다.
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