[C 프로젝트] 패킷 분석기 Part6. TCP 프로토콜 스택 정보를 알려주세요.

안녕하세요. 언제나 휴일에 언휴예요.

TCP 프로토콜 스택
TCP 프로토콜 스택

패킷 분석기는 Tcpdump처럼 pcaplib를 이용하여 네트워크 패킷을 수집한 pcap 파일 정보를 프로토콜 스택 별로 정보를 출력하는 프로그램입니다.

이번에는 TCP 프로토콜 스택 정보를 출력하는 부분을 구현합시다.

먼저 TCP 프로토콜 스택 구조를 살펴보아요.

TCP 프로토콜 스택은 옵션이 없는 기본 크기가 5옥텟(단위 4바이트)으로 20바이트입니다.

  • Source Port (16), Destination Port (16)

첫 번째 옥텟에는 발신자와 목적지의 포트 정보가 있습니다.

TCP 포트로 유명한 포트는 다음과 같습니다.

7(Echo), 9(Discard), 11(Users), 13(daytime), 17(Quote), 19(Chargen)
20(FTPD), 21(FTP), 23(TELNET), 25(SMTP), 53(DNS), 67(Bootps), 79(Finger)
80(HTTP), 68(Bootpc), 69(TFTP), 111(RPC), 123(NTP), 161(SNMP), 162(SNMP)
  • Sequence No. (32)

두 번째 옥텟에는 패킷 순차 번호가 있습니다.

첫 번째 패킷은 랜덤한 값으로 부여하여 ISN(Initial Sequence Number)라고 말합니다.

ISN 값을 부여하는 방식은 운영체제에 따라 다릅니다.

Seqeunce No.는 앞에서 전송한 바이트 수를 더한 값으로 증가합니다.

주의할 점은 SYN 플래그가 1일 때와 FIN, ACK 둘 다 1일 때는 크기가 없어도 1 증가합니다.

  • Acknowledgement No. (32)

수신한 패킷의 Seqence No.에 수신한 패킷의 크기를 더한 값으로 설정합니다.

  • HDLEN (4)

TCP 헤더 길이(단위 4바이트)를 나타냅니다.

  • Reserved (3)

현재 사용하지 않는 필드로 언제나 0입니다.

  • NS, CWR, ECE

NS(RFC 3540), CWR(RFC 3168), ECE(RFC 3168)은 2001년 이후에 새롭게 추가한 내용입니다.

이전에는 0으로 예약 필드였습니다.

이 세 가지 필드는 네트워크 트래픽 혼잡에 관한 필드입니다.

NS는 ECE와 CWR 필드를 실수나 악의적으로 회피하는 것을 막기 위해 추가한 필드입니다.

CWR은 ECE를 수신하여 윈도우 크기를 줄였으니 ECE를 보내지 말라는 신호입니다.

ECE는 트래픽이 혼잡하니 윈도우 크기를 줄이라는 신호입니다.

연결 과정(SYN플래그가 1)에서 ECE가 1이면 연결 후에때 ECN Echo를 사용한다는 것을 의미합니다.

열결 과정이 아니고(SYN 플래그가 0) ECE가 1이면 트래픽이 혼잡하니 윈도우 크기를 줄이라는 신호입니다.

  • URG (1), ACK (1), PSH (1), RST (1), SYN (1), FIN (1)

URG는 수신 세그먼트 순서가 어긋났을 때 Urgent Pointer에 유효한 데이터를 추가하였음

ACK는 수신한 패킷의 응답을 의미합니다.

Selective ACK
    TCP 헤더 끝에 옵션으로 순서에 어긋나거나 
    중복으로 온 것을 알림
    전송 후 RTO 타이머(보통 500ms)를 구동하여
    타임 아웃까지 ACK를 수신하지 못하면 재전송
지연 ACK
    RTO 타임 아웃 이후에 수신한 ACK를 지연 ACK라 부른다.
    이로 인해 수신 측에 중복 세그먼트 현상이 발생할 수 있다.

PSH는 버퍼링 데이터를 푸시

RST는 명확한 연결 해제를 의미합니다.

연결 요청을 거절할 때
WAIT 상태의 연결을 종료할 때
연결을 중단할 때

SYN은 TCP 연결 과정인 Three Handshake의 앞 쪽 두 패킷에 부여

FIN: 송신 데이터가 없음을 의미

Window Size: ACK 수신 없이 전송할 수 있는 데이터 크기, 수신 측에서 결정

Window Size의 자세한 알고리즘은 TCP 프로토콜 게시글을 참고하세요.

  • CheckSum (16)

헤더가 유효한지 판별하기 위한 필드

  • Urgent Point (16)

URG가 1일 때 긴급하게 보낸 데이터가 있는 위치 정보

  • Option (0~320)

Options의 자세한 알고리즘은 TCP 프로토콜 게시글을 참고하세요.