[네트워크] TCP 통신과 handshake

기석·2022년 6월 13일
0

네트워크

목록 보기
4/4

IP (Internet Protocol


인터넷 환경에서의 통신 규약.
패킷이라는 통신 단위로 데이터를 전달하며, 지정한 IP 주소로 데이터를 전달한다.
이때, 패킷을 받는 대상의 존재나 전달 여부는 확인하지 않아 비연결성과 비신뢰성을 특징으로 가진다.

TCP/IP


  • TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP와 전송 조절 프로토콜인 TCP를 합쳐 부르는 말이다.
  • TCP/IP를 사용한다는 것은 IP주소 체계를 따르며 TCP의 특성을 확용해 송수신자의 논리적 연결을 생성하고 신뢰성을 유지한다는 말이다.
  • HTTP, FTP, SMTP 등 TCP를 기반으로 하는 많은 애플리케이션들이 IP 위에서 동작하기 때문에 TCP/IP로 묶어 부른다.

TCP/IP Layer


OSI 7 계층 개념처럼 TCP/IP는 계층이 나뉘어져 있다.
OSI 7 계층과 TCP/IP 와 차이에 대한 내용은 전에 포스팅한 글이 있다. OSI 7계층 & TCP/IP

  1. 애플리케이션 계층
  2. 전송 계층
  3. 네트워크 계층
  4. 링크 계층

TCP/IP 통신의 흐름


TCP/IP 계층을 순서대로 거친다. 송신하는 측은 애플리케이션 계층부터 아래로, 수신하는 측은 네트워크 계층부터 위로 올라간다.

1. 애플리케이션 계층 (Application Layer)

웹 브라우저에 www.google.com을 입력하면 송신 측 클라이언트의 애플리케이션 계층(HTTP)에서 HTTP Request를 지시하여, HTTP 데이터를 생성한다.

2. 전송 계층 (Transport Layer)

애플리케이션 계층에서 생성된 HTTP 데이터는 트랜스포트 계층에 도착하면 TCP 세그먼트 단위로 잘게 나눠진다. 나눠진 세그먼트마다 송수신 포트번호와 시퀀스 넘버가 포함된 TCP 헤더가 추가된다.

수신측에서는 TCP 헤더의 포트 번호로 송 수신 애플리케이션을 구별하고 시퀀스 넘버로 세그먼트를 재조립한다.

control flags 안에는 ACK, SYN, FIN 등이 포함 되어있다.

3. 네트워크 계층

네트워크 계층은 트랜스포트 계층에서 생성된 TCP 세그먼트를 IP 패킷이라고 불리는 봉투에 담는다.
이 때 추가된 IP 헤더에는 송 수신 측 IP 주소가 담겨있다.
www.google.com이라는 도메인 주소로 IP를 알아내기 위해 DNS를 사용한다.

4. 링크 계층

마지막으로 링크 계층에서는 물리 주소인 자신의 MAC 주소를 추가한다.
이 때, MAC 주소를 얻기 위해 IP주소로 MAC주소를 찾아주는 ARP 프로토콜을 사용한다.

5. TCP 3-way handshaking

TCP/IP 4계층을 통과하며 수신측으로 데이터를 보낼 준비가 되었다.
하지만 TCP는 데이터를 전송하기 전에 네트워크 연결을 설정하는 3-way handshake 과정이 필요하다.

SYN: synchronize (동기화) , ACK: acknowledgment (승인)

  1. 클라이언트가 서버에 접속을 요청. SYN 플래그를 설정하고 랜덤 시퀸스 넘버 m을 보낸다.
  2. 서버는 해당 포트에 Listen한 상태. 서버는 SYN 패킷을 받고 랜덤 시퀸스 넘버 n을 SYN으로, ACK 플래그를 m+1로 설정한 TCP 패킷을 클라이언트에게 전송한다.
  3. 클라이언트는 서버로부터 ACK와 SYN 플래그가 설정된 패킷을 받고, ACK 플래그가 n+1로 설정된 패킷을 발송한다.
  4. 연결이 이루어지고 데이터가 오간다.

한 가지 의문점이 생겨 정리해보았다.

마지막 클라이언트 -> 서버 ACK 패킷 없이 바로 데이터 전송하면 안되나?

의문점

  1. 클라이언트 -> 서버 요청
  2. 서버 -> 클라이언트 OK

이후에 3. 클라이언트 -> 서버 OK 신호가 필요한 이유는 무엇일까?
2번에서 서버가 OK한 후에 바로 데이터 받을 준비를 하면 되지 않나?

이유

TCP 통신은 양방향 통신이기 때문에 client, server는 둘 다 데이터를 송신하고, 수신할 수 있다. 마지막 클라이언트의 ACK 패킷이 없다면 클라이언트가 데이터를 전송받을 준비가 되었는지 서버가 알 수 없다.

  • SYN 비트 => 데이터 보낼건데 준비됐어 S?
  • ACK 비트 => 데이터 받을 준비됐지 C

로 이해하면 편하다.

6. TCP 4-way handshaking


FIN: Finish 플래그

  1. 클라이언트가 Finish 플래그와 랜덤 난수 M을 서버에 전송한다.
  2. 서버는 Finish 플래그를 받았다는 뜻으로 Ack 플래그와 M+1 시퀀스 넘버를 전송한다.
    2.5 서버에서 남은 데이터를 전송한다.
  3. 서버의 데이터 전송이 끝나면 Fin 플래그와 난수 N을 클라이언트에게 전송한다.
  4. 클라이언트가 서버로부터 받은 난수 N에 1을 더하여 ACK 플래그로 서버에 전송한다.

왜 TCP 연결 종료는 4단계지?


TCP 연결을 설정하는 3-way handshake는 서버에서 ACK와 SYN 플래그를 한번에 전송했다.
하지만 TCP 연결을 종료할 때는 ACK 패킷 전송과 FIN 패킷 전송을 나눠서 했다. 그 이유가 무엇일까

4-way handshake에서 클라이언트가 FIN 패킷을 보낼 때, 아직 서버는 보낼 데이터가 남아 있을 수 있다. 그래서 클라이언트에게 FIN에 대한 응답으로 ACK 패킷을 보낸 후에, 남은 데이터를 보내고 FIN 패킷을 전송하는 것이다.

더 읽을 거리


출처

profile
개바라자

0개의 댓글