TCP (Transmission Control Protocol)


tcp

  • TCP는 응용 프로그램이 데이터를 교환할 수 있는 네트워크 대화를 설정하고 유지하는 방법을 정의하는 표준이다.

  • TCP는 IP 네트워크를 통해서 통신하는 호스트에서 실행되는 애플리케이션 간에 신뢰할 수 있고, 순서가 정해져있으며, 오류를 체크하고 전송할 수 있다.

  • 월드 와이드 웹, 이메일, 원격 관리, 파일 전송과 같은 주요 인터넷 애플리케이션은 전송 계층의 일부인 TCP에 의존한다.

  • SSL/TLS 또한 TCP 위에서 동작한다.

  • TCP는 인터넷 프로토콜 (IP)과 작동하여 컴퓨터가 서로 데이터 패킷을 보내는 방법을 정의한다.

연결을 맺는 과정


download

  • SYN: 클라이언트가 서버에 SYN를 전송한다. 클라이언트는 세그먼트의 시퀀스 번호를 임의의 값으로 설정한다.

  • SYN-ACK: 응답으로 서버는 SYN-ACK로 응답을 한다. 수신된 시퀀스 보다 많은 숫자로 설정 된다.

  • ACK: 마지막으로 클라이언트가 서버에 다시 ACK를 보낸다.

  • 이 과정을 통해서 서버와 클라이언트는 연결을 맺으며 3 Way HandShake라고 한다.

직접 확인하기

sudo tshark -i enp0s3 -f "tcp port 80"
  • 위의 명령어를 입력하여 포트 번호 80의 TCP 패킷들을 필터링 한다.

  • 이어서 다른 터미널에서 curl www.google.com 으로 구글 서버에 요청을 날린다.

today

  • 정상적으로 연결이 맺어진 것을 확인할 수 있다.

연결을 끊는 과정


520px-TCP_CLOSE svg

  • 연결을 종료하는 과정은 4 Way HandShake 라고 한다.

  • 연결이 끊겼음에도 클라이언트에서 TIME WAIT을 하는 이유는 지연되거나 유실된 패킷이 뒤늦게 전송되는 경우가 있기 때문이다.

확인해보기

4way

  • 위에서 했던 것과 같이 패킷을 캡처링 했을 때, 실제로 위와 같은 과정으로 커넥션을 끊는 것을 확인할 수 있다.

TCP 헤더 구조


header

  • 위에서 전송하는 SYN 패킷과 ACK 패킷은 TCP 헤더에서 위치에 해당하는 비트가 켜져서 전송된다.

TCP 연결이 맺음과 끊어짐에 따른 소켓의 변화


1920px-Tcp_state_diagram_fixed_new svg

  • 연결을 맺고 끊을 때마다 소켓의 내부 상태가 변하게 된다.

  • 클라이언트에서 요청을 보내기 위해서 소켓을 생성할 때 파일 디스크립터가 생성되며 연결을 끊고 싶을 때 파일을 닫게 되며, FIN 패킷을 날리게 된다.

Screen Shot 2021-04-20 at 11 40 13 PM

watch -n0.6 "netstat -atnp"
  • 위는 watch 명령어를 통해서 0.6초마다 netstat의 결과를 모니터링 하였다.

  • 그리고, CURL을 통해서 서버에 요청을 날리면 클라이언트 소캣의 상태를 확인할 수 있다.

참고 문헌


>> Home