[네트워크] TCP 프로토콜 (3 Hand Shacking)

최동혁·2023년 1월 30일
0

컴퓨터 네트워크

목록 보기
16/19

TCP 프로토콜

하는 일

구조

TCP 플래그

종류

  • 각각이 1 bit로 세팅되어 있는데, 0은 사용안하고, 1은 사용하는 것임..
  • 한번에 하나만 세팅해서 보내는게 아니라 여러개도 가능하다.

기능

Urgent
  • 긴급 bit
  • 1로 세팅해서 보내면, 이 네트워크 패킷은 우선순위가 높은 거라 빠르게 처리해줬으면 좋겠다는 뜻.
  • 그런데 요즘 별로 사용 안한다.
  • 요즘 네트워크 상태가 엄청 빨라서..
Reset
  • 초기화 bit
  • 연결이 잘못되었을 때 연결을 초기화 시키기 위함.
Acknowledgement
  • 승인 bit
  • 요청에 대한 대답으로 보낸다.
Syn
  • 동기화 bit
  • 요청할 때 보낸다.
Push
  • 밀어넣기 bit
  • 데이터를 보낼 때 쓴다.
Fin
  • 종료 bit
  • 데이터를 잘 받았으면 연결을 끊기 위해 쓰는 플래그.

TCP를 이용한 통신과정

연결 수립 과정

  • TCP 통신을 위한 네트워크 연결은 3 way handshake 라는 방식으로 연결된다.

  • 쉽게 이야기 하면, 서로의 통신을 위한 관문(port)을 확인하고 연결하기 위하여 3번의 요청/응답 후에 연결이 되는 것이다.

연결 수립을 하기 위한 통신 TCP 3Way Handshake

먼저 Server에서 열려있는 포트는 LISTEN 상태이고 Client에서는 Closed 상태이다.

  1. Client에서 Server에 연결 요청을 하기위해 SYN 데이터를 보낸다.
    Server에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고 SYN_RCV로 상태가 변경된다.

  2. 그리고 요청을 정상적으로 받았다는 대답(ACK)와 Client도 포트를 열어달라는 SYN 을 같이 보낸다.

  3. Client에서는 SYN+ACK 를 받고 ESTABLISHED로 상태를 변경하고 서버에 요청을 잘 받았다는 ACK 를 전송한다.

ACK를 받은 서버는 상태가 ESTABLSHED로 변경된다.

  • 여기서 Sync와 Ack는 받고 보낼 때 1씩 증가시킨다.
  • sync는 요청, ack는 응답이다.
  • 그래서 클라이언트가 서버에 처음 요청할 때 sync는 100이다.
  • 그거에 대한 응답인 ack는 요청 받은 sync인 100에 1을 더해서 ack로 101이 가는 것이다.
  • 그리고 서버가 클라이언트에게 port를 알려달라고 새 요청을 보냈기에 새로운 sync인 2000으로 시작한다.
  • 그거에 대한 대답을 클라이언트가 하면서 sync였던 2000이 ack 2001로 변경되는 것이다!

데이터 송수신 과정

HTTP나 FTP와 같은 각종 데이터를 포함한 통신

  • 위에서 3handshake를 하고 난 후, 클라이언트가 다시 웹 서버로 요청을 보낸다.
  • 아까 보냈던 번호 그대로 이어서 보낸다.
  • push와 ack를 같이 해서 보내는데, 아까는 1씩 증가시키면서 동기화를 시켰는데, 그때는 데이터를 안보냈다.
  • 그런데 이번엔 100바이트짜리 데이터를 보냈기 때문에 100이 증가한다.
  • 그러면 이번엔 클라이언트가 서버에게 500바이트 짜리 데이터를 보낸다면?
  • A가 500증가 한 채로 간다.

실습

  • vm을 두개를 킨다.
  • 한개는 Berryz Webshare 프로그램을 다운받아 켜준다.
  • 나머지 하나는 client로서 wireshark를 켜준다.
  • 그 후, 서버에 txt 파일을 하나 넣어주자.

  • 서버의 ip와 port를 입력하면 위의 그림처럼 연결이 된다.
  • 위의 그림과 같이 client 측에서 파일이 잘 보이는 것을 확인할 수 있다.
  • client의 wireshark를 실행 시킨다.
  • 위의 그림처럼 필터를 서버의 ip 주소로 걸어준다.
  • 그 후, 아무 패킷이나 오른쪽 마우스를 클릭해 Follow -> TCP Stream 클릭

  • 그러면 그 패킷의 흐름을 볼 수 있다.

  • 아래서 부터 부면 된다.
  • 클라이언트가 처음 서버에게 Sync를 보낸다.
  • 그러면 서버가 클라이언트에게 Sync와 Ack를 보낸다.
  • 다시 클라이언트가 서버에게 Ack를 보낸다.
  • 이로써 클라이언트와 서버가 연결이 되었다. 이것을 3 Hand Shacking이라고 한다.

  • 위의 wireshark 메뉴에서 statistic의 Flow Graph를 누르고, Limit to Display filter를 클릭하면 위의 그림처럼 우리가 이론적으로 배운 내용들이 나온다.

  • 서버와 클라이언트 연결을 위한 3 Hand Shacking을 한다.

  • 그 이후, 데이터를 주고 받으며 서로 응답을 하는걸 볼 수 있다.

TCP 상태 전이도

TCP 연결 상태의 변화

  • 실선은 클라이언트쪽 상태 변화
  • 점선은 서버쪽 상태 변화

서버

  • 서버는 항상 24시간 켜져 있어야 한다.
  • 서버를 키게 되면 LISTEN 상태로 변경이 된다.
  • 클라이언트 측에서 패킷을 보내면 서버는 SYN_RCVD 상태가 된다.
  • 받았다고 응답을 클라이언트에 보내고, 클라이언트가 서버가 보낸 응답을 받았다고 보내면 서버는 ESTABLISHED 상태가 된다.

클라이언트

  • 클라이언트 측에서 서버측에 패킷을 보내면 SYN_SENT 상태가 된다.
  • 그 상태에서 서버 측에 SYN, ACK를 보내면서 ESTABLISHED 상태가 된다.

3 Way Handshake와 함께보기

  • 클라이언트가 패킷 만들어서 보내면 SYN_SENT 상태
  • 서버는 받으면 SYN_RECEIVED 상태가 되고, 응답을 만들어서 보낸다.
  • 클라이언트는 받았을 때, 응답을 보냄과 동시에 ESTABLISHED 상태가 되고, 서버는 패킷을 받게 되면 ESTABLISHED 상태가 되는 것이다.

실습

  • netstat -ano 를 이용해 서버가 켜져 있는지 보자
  • 오른쪽을 보면 서버쪽이 LISTENING 상태로, 클라이언트와 연결될 준비가 되어있는걸 볼 수 있다.

서버

클라이언트

  • 서버 입장에서는 클라이언트가 오른쪽에 와있고, 클라이언트 입장에서는 서버가 오른쪽으로 와있다.
  • 그리고 ESTABLISHED로 되어있는데, 파일을 주고 받을 수 있는 상태라는 것이다.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글