[21.9.22] 와이어샤크를 통한 TCP 프로토콜 필드 분석
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788965402589
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791186978313
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=goduck2&logNo=221214619048
해당 서적과 블로그를 참고하여 작성하였습니다.
전송(transport) 계층은 네트워크 통신의 엔드 포인트의 사용자들이 신뢰성 있는 데이터를 주고받기 위해 그리고 상위 계층의 데이터 전달에 대해서 유효성이나 효율성을 보장해준다. 특정 연결에 대한 유효성을 입증하기 때문에 패킷들의 내용이 유효한지 확인하며, 전송에 실패한 패킷들을 재전송하게 된다.
전송 계층에서 사용하는 프로토콜은 신뢰성이 보장되는 TCP와 신뢰성이 보장되지 않는 UDP로 구분된다.
TCP 프로토콜의 가장 중요한 특징은 수신자에게 데이터를 정확히 줄 수 있으며, UDP 프로토콜과는 달리 데이터를 전달하기 전 준비 단계인 세션 연결 과정을 거친다. 세션 연결 이후 데이터를 전송하며, 데이터 전송 중 발생하는 데이터 손실 문제는 재전송 기능을 통해서 보완한다.
TCP 통신에서 가장 핵심적인 과정은 3-way-handshake라고 불리는 세션을 연결하는 절차이다. 다음과 같이 SYN, SYN-ACK, ACK 과정으로 상대방의 요청 확인 및 승낙 등의 작업을 수행한다.
TCP 통신 시작(세션 연결 3-way-handshake)
1. 클라이언트가 통신 요청으로 TCP flag bits에 SYN을 1을 증가시킨 상태에서 서버에 요청한다.
2. 서버는 SYN과 ACK 에 대해 1을 증가시킨 상태에서 응답하며 클라에게 다시 보낸다.
3. 클라는 ACK을 1 증가시킨 상태로 TCP를 서버에 전달하면 세션을 성립시킨다.
세션 연결 확립 후 데이터 송수신
1. 만약 HTTP를 이용하여 웹 페이지를 요청한다고 가정하자면 페이지를 요청하는 HTTP 아래에 TCP 프로토콜에 PSH flag가 1 증가한다.
2. 서버가 요청을 받았다는 ACK을 보낸다.
3. 요청한 페이지를 전달하는 http 응답 프로토콜과 TCP push flag가 1인 데이터를 보낸다.
4. 클라가 마무리로 서버에게 ACK 패킷을 보낸다.
통신종료(세션종료)
4-way-handshake라고 불리는 세션을 종료하는 절차이다. 통신을 시작한 쪽에서 먼저 FIN-ACK을 전달하여 통신 해제를 요청하고 수신자도 같은 방식으로 FIN-ACK을 전송하여 통신을 종료하게 된다.
1. 클라가 서버에게 통신을 종료한다는 FIN+ACK flag에 1을 올리는 TCP 패킷을 서버에게 요청한다.
2. 서버가 클라에게 ACK가 1인 패킷을 응답한다.
3. 서버가 클라에게 FIN+ACK 패킷을 전송한다.
4. 잘 받았다는 의미로 클라가 서버에게 ACK 패킷을 전송한다.
TCP 헤더는 총 20바이트이며 다음과 같이 이더넷 헤더와 IP 헤더 다음에 달라붙는다.
송신자 포트 번호(16비트)
웹 브라우저를 통해 yes24 웹페이지에 접근한다고 가정했을 때 로컬 PC의 출발지 포트는 1,024번 이상의 포트 번호로 임의 할당하여 yes24 웹 서버에 접속하게 된다. 위의 와이어샤크로 봤을때 Source Port가 58908로 된 것을 볼수 있다.
수신자 포트 번호(16비트)
접속하고자 하는 목적지 서버의 포트번호가 할당된다. yes24 웹 페이지를 접속했을 때 목적지 포트는 80으로 된 것을 볼수 있다.
시퀀스번호(32비트)
TCP에서는 패킷을 전송할 때마다 패킷에 고유한 번호를 부여한다. 이 고유한 번호를 시퀀스 번호라고 한다. SYN이나 FIN을 전송한다면 전송자의 다음 시퀀스 번호, 즉 상대적인 시퀀스 번호가 1씩 증가한다. 만약 데이터를 전송한다면 다음의 시퀀스 번호는 데이터의 크기만큼 증가하게 된다.
와이어샤크에서는 절대적인 시퀀스 번호와 상대적인 시퀀스 번호가 있는데 TCP 시퀀스 번호는 실제로는 TCP 세션이 맺어지고 이때 시퀀스 넘버가 임의의 초기값으로 생성되어 들어간다. 즉, 클라이언트와 서버가 각각 rand() 함수로 인해 임의의 시퀀스 넘버가 들어간다. 이 값을 절대적인 시퀀스 번호라고 한다.
위의 이미지에서 3-way-handshake로 인해 상대적인 시퀀스 넘버가 1 증가한 상태지만 바로 아래 절대적인 시퀀스 넘버는 367,160,303인 것을 볼 수 있다.
승인 번호(Acknowledgement Number(32비트))
패킷을 오류 없이 수신했을 때 송신자에게 정상 수신 여부를 알려주기 위하여 사용하는 번호이다. SYN이나 FIN을 수신하면 수신자의 승인번호는 1씩 증가하며, 데이터를 수신한다면 데이터의 크기만큼 증가한다. 다른 의미로 지금까지 전송한 데이터는 잘 받았으니 다음에 전송할 시퀀스 번호는 몇 번이다 라는 것을 송신자에게 알려주는 의미이다. 전송하는 승인번호는 다음에 송신자가 전송할 시퀀스 번호가 같은 값을 가진다. 시퀀스 번호와 마찬가지로 3-way-handshake 세션 성립으로 인해 초기 랜덤 값을 가진다.
※승인 번호는 다음 송신자가 전송할 시퀀스 번호라고 생각하면 편하다. 시퀀스 번호와 승인 번호 계산 방법은 나중에 따로 작성을 해야겠다...
데이터 오프셋, 예약비트, 컨트롤플래그(합쳐서 총 16비트)
데이터 오프셋(4비트) : TCP 헤더 길이를 제공한다. IP 헤더 필드의 IHL과 같이 총 헤더의 길이 / 4bytes로 계산하여 들어간다. 보통 TCP 헤더 길이는 20bytes이므로 이진수 0101이 들어간다고 생각하면 편하다.
Reserved bits(6비트) : 예약된 필드로 현재는 사용하지 않는 필드로 보고 있다. 그래서 000 000이 들어간다.
컨트롤 플래그(6비트) : 6개의 비트로 구성되어 있으며, 해당 비트 조합을 통하여 통신 시작, 데이터 전송, 통신 해제등의 통신 상태를 표기한다.
Flags | 설명 |
URG | 긴급 요청 |
ACK | 응답 메시지 |
PSH | 수신한 데이터를 어플리케이션 계층으로 즉시 전달한다. |
RST | 강제로 맺은 세션을 종료시킨다. |
SYN | 연결 요청 |
FIN | 정상적으로 세션을 종료한다. |
Windows size(16비트)
수신 가능한 데이터 크기를 기록한다. 두 PC 간 윈도우 크기가 다를 경우에 작은 크기에 맞추어 데이터를 송신한다.
TCP 헤더 체크섬(16비트)
헤더 값의 에러 발생 여부를 검사하기 위해 사용한다. TCP 헤더 체크섬 값은 다음과 같이 구하면 된다.
1. IP 헤더의 프로토콜 + 출발지 아이피 + 목적지 아이피 + Total TCP Length(Total IP Length - IP Header Length)의 합산(16진수 4자리씩 끊어서 계산)
2. TCP헤더의 합계(헤더 체크섬 값 제외)
3. TCP 데이터(페이로드)의 합계
4. 1 + 2 + 3을 합산한다.
5. 합하여 16진수 5자리 이상의 값이 나오면 좌측에 있는 16진수 값을 재합산한다. EX)C3218, C + 3218 = 3224
6. 합산 결과를 2진수로 표현하고 1의 보수화를 취한다.
이외에도 Urgent pointer는 플래그 필드에 URG 플래그가 설정된 패킷에서만 사용하며, 옵션은 상세한 조정 기능을 위해 사용된다. 마지막으로 Padding은 헤더가 4bytes의 정수배가 되지 않을 때 0을 덧붙여서 헤더의 크기를 조정한다.
'네트워크' 카테고리의 다른 글
[21.10.3] 이더넷 프레임의 필드 구조 (0) | 2021.10.03 |
---|---|
[21.9.23]UDP 프로토콜 개념과 필드 구성 (0) | 2021.09.23 |
[21.9.20] 와이어 샤크를 통한 IPv4 프로토콜 필드 확인 (0) | 2021.09.20 |
[21.9.19] 와이어 샤크의 기본 단축키 - 2 (0) | 2021.09.19 |
[21.9.19] 와이어샤크를 통한 패킷 헤더 확인 (0) | 2021.09.19 |
댓글
이 글 공유하기
다른 글
-
[21.10.3] 이더넷 프레임의 필드 구조
[21.10.3] 이더넷 프레임의 필드 구조
2021.10.03 -
[21.9.23]UDP 프로토콜 개념과 필드 구성
[21.9.23]UDP 프로토콜 개념과 필드 구성
2021.09.23 -
[21.9.20] 와이어 샤크를 통한 IPv4 프로토콜 필드 확인
[21.9.20] 와이어 샤크를 통한 IPv4 프로토콜 필드 확인
2021.09.20 -
[21.9.19] 와이어 샤크의 기본 단축키 - 2
[21.9.19] 와이어 샤크의 기본 단축키 - 2
2021.09.19