특정 계층이 변경되었을 때 다른 계층이 영향을 받지 않도록 설계되어 있다.
응용 프로그램이 사용되는 프로토콜 계층이다.(HTTP, SSH, FTP, SMTP, DNS)
서비스를 실질적으로 사람들에게 제공하는 층이다.
DNS
도메인 이름과 IP주소를 매핑해주는 서버이다. www.naver.com에 DNS 쿼리가 오면 [Root DNS] -> [.com DNS] -> [.naver DNS] -> [.www DNS] 과정을 거쳐 IP주소를 찾아낸다. 이를 통해 IP주소가 바뀌어도 사용자에게 똑같은 도메인 주소로 서비스할 수 있다.
전송 계층은 송신자와 수신자를 연결하는 서비스를 제공한다.
연결 지향 데이터 스트림 지원, 신뢰성, 흐름 제어를 제공한다.
TCP : 패킷 사이의 순서를 보장하고 연결지향 프로토콜을 사용해 연결하여 신뢰성을 구축해 수신 여부를 확인한다. '가상회선 패킷 교환 방식'을 사용한다.
UDP : 순서와 수신 여부를 보장하지 않는다. 단순히 데이터만 주고 받는 '데이터그램 패킷 교환 방식'을 사용한다.
두 엔드포인트가 데이터를 주고 받을 준비가 됐다는 것을 보장하기 위해 3-way 핸드쉐이크를 진행한다.
1. 클라이언트는 서버에 클라이언트의 ISN을 담아 SYN을 보낸다. ISN은 새로운 TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀀스 번호이다.
2. 서버는 클라이언트의 SYN을 수신하고 서버의 ISN과 승인번호로 클라이언트의 ISN + 1을 보낸다.
3. 클라이언트는 서버의 ISN + 1을 승인번호로 담아 ACK을 서버에 보낸다.
1. 연결을 끊고자 하는 쪽(hostA)에서 close()
를 호출하면 FIN 패킷을 보낸다.(Half-Close 기법, FIN(+ACK)을 보내고 ACK 번호까지 받았으니, 더 보낼 것이 남아있으면 보내라고 상대에게 알림.)
2. hostB에서 ACK를 보내고 CLOSE_WAIT
상태가 된다. 버퍼에 남은 데이터를 모두 보낸다.
3. hostB에서 close()
를 호출하여 FIN 패킷을 보낸다.
4. hostA에서 TIME_WAIT
만큼 기다린 후 ACK 패킷을 보낸다.
TIME_WAIT
만큼 기다리는 이유는?
- hostB에서 보낸 FIN에 대한 ACK를 hostA에서 보내는데, 패킷이 유실될 수 있다. 따라서 패킷이 유실되면 hostB에서는 FIN 패킷을 다시 보내게 된다. FIN 패킷이 다시 오지 않으면 hostB가 ACK를 받았다고 판단하고 안전하게 연결을 종료하기 위하여
TIME_WAIT
만큼 기다리는 것이다. (만약TIME_WAIT
가 없다면 다른 연결이 해당 소켓에 할당되어 hostB로부터 FIN 패킷을 받아서 혼란이 초래될 수 있다.)- hostB에서 보낸 데이터가 아직 도착하지 않았을 수도 있기 때문이다.
왜 연결은 3-way인데 종료는 4-way일까?
한 쪽에서는 데이터 전송을 끝냈다고 해도 다른 한 쪽에서는 보내야 할 데이터가 남아 있을 수 있기 때문이다.