데이터 송수신 완료 후
- 데이터 송수신 완료 후 연결 끊기 단계로 진입한다.
- 연결 끊기는 서버측, 클라이언트 측 어느 쪽이든 시작할 수 있다.
서버 측(연결 끊기 시작)
- 서버 측 애플리케이션이 Socket 라이브러리의 close를 호출
- 서버 측 프로토콜 스택이 TCP 헤더를 만들고, 여기에 연결 끊기를 나타내는 정보를 설정
- 컨트롤 비트의 FIN 비트에 1을 설정하고, IP 담당 부분에 의뢰하여 클라이언트에 송신을 요청
- 서버측의 소켓에 연결 끊기 동작에 들어갔다는 정보를 기록
클라이언트 측
- 서버에서 FIN에 1을 설정한 TCP 헤더가 도착하면 클라이언트 측 프로토콜 스택은 자신의 소켓에 서버측이 연결 끊기 동작에 들어갔다는 것을 기록
- FIN을 1로 설정한 패킷을 받았다는 사실을 알리기 위해 ACK 번호를 서버측에 반송하고 애플리케이션이 데이터를 가지러올 때까지 기다린다.
- 애플리케이션이 read를 호출하여 데이터를 가지러 오면 데이터를 건네지 않고 서버에서 보낸 데이터를 전부 수신 완료했다는 사실을 클라이언트의 애플리케이션에 알린다.
- 서버에서 보낸 데이터를 전부 수신하면 클라이언트가 종료되고 애플리케이션도 close를 호출하여 데이터 송수신 동작을 끝낸다.
- 프로토콜 스택은 서버측과 마찬가지로 FIN 비트에 1을 설정한 TCP 헤더를 만들고 IP 담당 부분에 의뢰하여 서버에 송신한 후 ACK 번호를 반송받으면 서버와 대화를 끝낸다.
소켓 말소
- 소켓은 서버와 대화가 끝난 후 바로 말소되지 않는다.
- 서버가 ACK를 대기하다가 다시 FIN을 보냈을 때 해당 포트번호의 소켓 자리에 다른 새로운 애플리케이션이 실행된 경우 엉뚱한 소켓의 연결 끊기 동작을 유발할 수 있기 때문이다.
- 따라서 소켓은 몇분 지속시키고나서 말소한다.
IP와 이더넷의 패킷 송수신
패킷의 기본 구성
TCP/IP의 패킷
MAC 헤더 + IP 헤더 + TCP 헤더 + 데이터 조각
- MAC 헤더: 이더넷의 제어 정보
- IP 헤더: IP의 제어 정보
패킷 전송
- 헤더의 제어 정보를 통해 중계 장치에서 중계 장치로 전송된다.
- 최종 목적지(엔드 노드)로 패킷이 이동한 후에는 회답을 위해 송신처가 수신처가 되고 수신처는 송신처가 된다.
허브
- 서브넷 안에서 이더넷의 규칙에 따라 패킷을 운반하여 다음 라우터에 도착
라우터
- IP 규칙에 따라 목적지를 확인하여 다음 라우터를 나타낸다.
헤더
- MAC 헤더(이더넷용 헤더): 다음 중계장치에 따라 변동
- IP 헤더(IP용 헤더): 패킷의 최종 목적지, 액세스 대상 서버의 IP 주소를 담은 헤더
IP 헤더
- 수신처 IP 주소
- 송신처 IP 주소
- LAN 어댑터에 할당된 IP 주소
- LAN 어댑터가 여러 개 장착된 경우 내보낼 LAN 어댑터의 주소로 설정
- 프로토콜 번호
- 패킷의 데이터가 어디에서 의뢰받은 것인지를 표시
MAC 헤더
- 무선의 경우 형태가 다른 듯하다. 일단은 유선을 다룬다.
- IP와 달리 48비트이며 단일 값으로 취급한다.
- 내용물에 관한 정보를 타입으로 기재한다. 내용물은 IP나 ARP라는 프로토콜의 소켓이며 각각에 대응하는 규칙이 다르다.
MAC 헤더 생성
- 타입을 우선적으로 설정
- 송신처 MAC 주소를 설정 물론 송신하는 LAN 어댑터 주소를 기입한다.
- 수신처 MAC 주소를 설정, 이 시점에 아직 건네줄 대상이 정해지지 않았기 때문에 경로표에서 찾은 일치하는 행의 ‘Gateway’ 항목에 기록되어 있는 IP의 주소의 기기를 찾아 대상 기기의 MAC 주소를 기입한다.
ARP(Address Resolution Protocol)로 수신처 라우터의 MAC 주소를 조사
- 이더넷은 연결되어 있는 모두에게 패킷을 전달하는 브로드캐스트라는 구조가 있으며 이를 이용하여 수신처에 해당하는 IP주소를 가진 기기를 호출하고 호출받은 기기가 MAC 주소로 응답한다. 이것이 ARP이다.
- 패킷을 보낼 때마다 이 동작이 수행되면 ARP의 패킷이 불어나기 때문에 한 번 조사한 결과는 ARP 캐시라는 메모리 영역에 보존되어 재사용된다.
- IP 주소가 변경될 수 있다는 점 때문에 ARP 캐시에 저장된 값은 일정 시간이 지나면 삭제된다.