TCP (Transmission Control Protocol)
-
TCP는 응용 프로그램이 데이터를 교환할 수 있는 네트워크 대화를 설정하고 유지하는 방법을 정의하는 표준이다.
-
TCP는 IP 네트워크를 통해서 통신하는 호스트에서 실행되는 애플리케이션 간에 신뢰할 수 있고, 순서가 정해져있으며, 오류를 체크하고 전송할 수 있다.
-
월드 와이드 웹, 이메일, 원격 관리, 파일 전송과 같은 주요 인터넷 애플리케이션은 전송 계층의 일부인 TCP에 의존한다.
-
SSL/TLS 또한 TCP 위에서 동작한다.
-
TCP는 인터넷 프로토콜 (IP)과 작동하여 컴퓨터가 서로 데이터 패킷을 보내는 방법을 정의한다.
연결을 맺는 과정
-
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
으로 구글 서버에 요청을 날린다.
- 정상적으로 연결이 맺어진 것을 확인할 수 있다.
연결을 끊는 과정
-
연결을 종료하는 과정은
4 Way HandShake
라고 한다. -
연결이 끊겼음에도 클라이언트에서
TIME WAIT
을 하는 이유는 지연되거나 유실된 패킷이 뒤늦게 전송되는 경우가 있기 때문이다.
확인해보기
- 위에서 했던 것과 같이 패킷을 캡처링 했을 때, 실제로 위와 같은 과정으로 커넥션을 끊는 것을 확인할 수 있다.
TCP 헤더 구조
- 위에서 전송하는 SYN 패킷과 ACK 패킷은 TCP 헤더에서 위치에 해당하는 비트가 켜져서 전송된다.
TCP 연결이 맺음과 끊어짐에 따른 소켓의 변화
-
연결을 맺고 끊을 때마다 소켓의 내부 상태가 변하게 된다.
-
클라이언트에서 요청을 보내기 위해서 소켓을 생성할 때 파일 디스크립터가 생성되며 연결을 끊고 싶을 때 파일을 닫게 되며, FIN 패킷을 날리게 된다.
watch -n0.6 "netstat -atnp"
-
위는 watch 명령어를 통해서 0.6초마다 netstat의 결과를 모니터링 하였다.
-
그리고, CURL을 통해서 서버에 요청을 날리면 클라이언트 소캣의 상태를 확인할 수 있다.
참고 문헌
>> Home