인터넷 환경에서의 통신 규약.
패킷이라는 통신 단위로 데이터를 전달하며, 지정한 IP 주소로 데이터를 전달한다.
이때, 패킷을 받는 대상의 존재나 전달 여부는 확인하지 않아 비연결성과 비신뢰성을 특징으로 가진다.
OSI 7 계층 개념처럼 TCP/IP는 계층이 나뉘어져 있다.
OSI 7 계층과 TCP/IP 와 차이에 대한 내용은 전에 포스팅한 글이 있다. OSI 7계층 & TCP/IP
TCP/IP 계층을 순서대로 거친다. 송신하는 측은 애플리케이션 계층부터 아래로, 수신하는 측은 네트워크 계층부터 위로 올라간다.
웹 브라우저에 www.google.com을 입력하면 송신 측 클라이언트의 애플리케이션 계층(HTTP)에서 HTTP Request를 지시하여, HTTP 데이터를 생성한다.
애플리케이션 계층에서 생성된 HTTP 데이터는 트랜스포트 계층에 도착하면 TCP 세그먼트 단위로 잘게 나눠진다. 나눠진 세그먼트마다 송수신 포트번호와 시퀀스 넘버가 포함된 TCP 헤더가 추가된다.
수신측에서는 TCP 헤더의 포트 번호로 송 수신 애플리케이션을 구별하고 시퀀스 넘버로 세그먼트를 재조립한다.
control flags 안에는 ACK, SYN, FIN 등이 포함 되어있다.
네트워크 계층은 트랜스포트 계층에서 생성된 TCP 세그먼트를 IP 패킷이라고 불리는 봉투에 담는다.
이 때 추가된 IP 헤더에는 송 수신 측 IP 주소가 담겨있다.
www.google.com이라는 도메인 주소로 IP를 알아내기 위해 DNS를 사용한다.
마지막으로 링크 계층에서는 물리 주소인 자신의 MAC 주소를 추가한다.
이 때, MAC 주소를 얻기 위해 IP주소로 MAC주소를 찾아주는 ARP 프로토콜을 사용한다.
TCP/IP 4계층을 통과하며 수신측으로 데이터를 보낼 준비가 되었다.
하지만 TCP는 데이터를 전송하기 전에 네트워크 연결을 설정하는 3-way handshake 과정이 필요하다.
SYN: synchronize (동기화) , ACK: acknowledgment (승인)
한 가지 의문점이 생겨 정리해보았다.
이후에 3. 클라이언트 -> 서버 OK 신호가 필요한 이유는 무엇일까?
2번에서 서버가 OK한 후에 바로 데이터 받을 준비를 하면 되지 않나?
TCP 통신은 양방향 통신이기 때문에 client, server는 둘 다 데이터를 송신하고, 수신할 수 있다. 마지막 클라이언트의 ACK 패킷이 없다면 클라이언트가 데이터를 전송받을 준비가 되었는지 서버가 알 수 없다.
로 이해하면 편하다.
FIN: Finish 플래그
TCP 연결을 설정하는 3-way handshake는 서버에서 ACK와 SYN 플래그를 한번에 전송했다.
하지만 TCP 연결을 종료할 때는 ACK 패킷 전송과 FIN 패킷 전송을 나눠서 했다. 그 이유가 무엇일까
4-way handshake에서 클라이언트가 FIN 패킷을 보낼 때, 아직 서버는 보낼 데이터가 남아 있을 수 있다. 그래서 클라이언트에게 FIN에 대한 응답으로 ACK 패킷을 보낸 후에, 남은 데이터를 보내고 FIN 패킷을 전송하는 것이다.
출처