이 포스팅은 LetsDefend에서 무료로 제공되는 Network Protocols 코스를 공부한 내용입니다
https://app.letsdefend.io/training/lessons/network-protocols
TCP(Transmission Control Protocol)
: tcp는 OSI 모델의 4번째 네트워크 계층에 위치해 있고, 신뢰성 있고 안정적인 데이터 전송의 역할
TCP 프로토콜의 특징
- 두 애플리케이션 간 데이터 전송을 보장
- 여러 연결을 허용
- 연결이 설정되기 전에는 데이터 전송이 X
- 전송되는 데이터에 대한 우선순위와 보안 정의
- 오류/흐름 제어를 수행
TCP 연결 3-Way Handshake
- TCP 연결을 설정하려는 송신자가 "SYN" 플래그가 설정된 TCP 세그먼트를 수신자에게 전송
- 수신자는 이 세그먼트를 받은 후 "SYN"과 "ACK" 플래그가 설정된 TCP 세그먼트를 송신자에게 전송
- 마지막으로 송신자는 "ACK" 플래그가 설정된 TCP 세그먼트를 수신자에게 다시 전송하며 연결완료
+ SYN 및 ACK 플래그는 TCP 프로토콜 헤더 내에서 1비트 영역
+ 각 TCP 연결은 “소스 IP 주소-소스 포트 번호”, “목적지 IP 주소-목적지 포트 번호” 정보를 포함
TCP 연결 종료
- 연결을 종료하려는 장치는 "FIN" 플래그가 설정된 TCP 세그먼트를 타겟 장치에 전송
- 타겟 장치는 이 세그먼트를 받은 후 "FIN" 플래그가 설정된 TCP 세그먼트를 "ACK" 플래그와 함께 송신자에게 전송
- 타겟 장치는 "FIN" 플래그가 설정된 TCP 세그먼트를 연결 종료를 원하는 장치에 전송
- 마지막으로 연결을 종료하려는 장치는 수신된 TCP 세그먼트에 "ACK" 플래그가 설정된 세그먼트를 응답으로 전송하고 TCP 연결이 종료
TCP 프로토콜에서는 데이터를 8비트 크기의 세그먼트로 전송힘. 각 세그먼트는 고유한 식별 번호가 붙어 있고 이 번호를 통해 데이터가 제대로 전송됐는지 확인한다. 송신자가 데이터를 전송→ 수신자는 이를 확인하고 응답을 보냄 → 수신자가 응답을 보냄 → 송신자는 그다음 데이터를 보냄
TCP 연결을 설정할 때, "초기 시퀀스 번호(ISN)"라는 숫자가 무작위로 설정되는데 이 번호는 첫 번째 데이터 전송에 사용됨. 이후, 전송된 데이터의 크기만큼 이 번호가 계속 증가하면서 새로운 "시퀀스 번호"가 만들어짐.
→ 시퀀스 번호를 통해 송신자는 수신자가 데이터를 정확히 받았는지 확인
Ex) 초기 시퀀스 번호가 0일 때 1024바이트 데이터를 전송하고, 수신자가 이를 제대로 받았다는 응답(ACK)을 보내면 시퀀스 번호는 그만큼 증가함. 만약 응답이 오지 않으면, 송신자는 해당 데이터를 다시 전송하는데 이렇게 TCP는 데이터가 정확하고 순서대로 전송되도록 보장함
포트 Port란?
포트는 애플리케이션이 서로 통신할 때 사용하는 통신 지점. 하나의 서버에서 여러 개의 서비스가 동시에 실행될 수 있도록, 수신된 요청이 어떤 서비스에 속하는지를 구분하는 역할
포트 번호는 기본적으로 0부터 65535까지의 값이다. 포트 번호와 IP 주소는 소켓 주소를 형성하는데, 예를 들어 "192.168.5.100:8080"은 두 개의 정보, 즉 IP 주소와 포트 번호로 구분되는 방식
기본 포트 번호들
FTP : 21
SSH : 22
Telnet : 23
SMTP : 25
DNS : 53
HTTP : 80
POP3 : 110
SMB : 445
TCP 프로토콜 헤더
시퀀스 번호 (Sequence Number)
TCP 세그먼트의 전송을 추적하는 데 사용되는 번호. 만약 TCP 세그먼트에 "SYN" 플래그가 설정되어 있으면, 이 번호는 초기 시퀀스 번호 값이 된다. 32비트 길이
확인 번호 (Acknowledgement Number)
필드는 송신된 세그먼트의 전송이 어느 바이트까지 완료되었는지를 나타내는 값으로 마찬가지로 32비트 길이임.
헤더 길이 (Header Length, HLEN)
TCP 헤더 길이 값을 담고 있는 필드, 4비트 길이
예약 (Reserved)
향후 사용을 위해 예약된 필드임 3비트 길이
제어 플래그 (Control Flags)
플래그 값들이 저장되는 필드이고 각 플래그는 1비트 길이이다. 플래그가 설정되면 이 값은 이진수로 "1"이 되고 총 필드 길이는 9비트임.
- SYN: TCP 연결을 시작하는 데 사용되는 플래그
- ACK: 패킷 전송을 확인하는 플래그, 연결 설정을 확인
- FIN: TCP 연결을 정상적으로 종료하는 데 사용되는 플래그
- RST: TCP 연결을 일방적으로 급격하게 종료하는 데 사용되는 플래그, 연결을 리셋하는 데 사용
- PSH: 데이터를 대상 애플리케이션에 전송할 때 설정되는 플래그
- URG: 긴급하고 우선순위가 높은 데이터가 있음을 알리기 위해 사용되는 플래그
윈도우 크기 (Window Size)
수신자의 버퍼 용량에서 최대 데이터 크기가 정의된 필드로 16비트 길이
체크섬 (Checksum)
TCP 세그먼트가 전송 중에 무결성이 유지되는지 여부를 검사하는 필드로 이 값은 16진수 값, 16비트 길이
긴급 포인터 (Urgent Pointer)
긴급 바이트가 어디까지 전송되었는지를 나타내는 값으로 "URG" 플래그가 설정될 때만 사용된다. 16비트 길이임
옵션 (Options)
TCP 프로토콜의 추가 기능을 사용하기 위한 필드인데 사용이 필수는 아니며 고정된 길이가 없음.
Netcat을 활용해서 TCP 연결하기
Netcat 툴을 이용해서 TCP 연결을 할 수 있는데 nc 명령어를 사용하면 됨
sudo nc -lvp 5555
-l | listen mode |
-v | verbose |
-p | specify local port for remote connects |
nc는 리눅스 명령어처럼 사용해서 CLI 기반인 반면에
GUI 환경에서 네트워크를 파악할 수 있는 wireshark도 있다
실습해 보자
실습
문제가 6개 있었는데 그중에서 제일 시간이 걸린 두 문제만 다뤄보겠음
What is the word in the data field of the packet of which the sequence number value is “3619946163” according to the PCAP file?
시퀀스 넘버가 info 탭에 있는 줄 알았는데 헤더 부분을 다 뒤져야 나오는 거였다.
3619946163이 시퀀스 넘버인 파켓을 찾고 follow tcp stream으로 들어가니
정답을 찾았다: letsdefend
Find out the TCP flag(s) that is/are set in the "78 byte" long packet according to the PCAP file.
78바이트인 파켓이 하나밖에 없어서 금방 찾음
정답: PSH, ACK
다음 편에서는 UDP, DNS에 대해 알아보자
'네트워크' 카테고리의 다른 글
[LetsDefend] Network Protocols 네트워크 프로토콜 - DNS, Telnet (0) | 2025.02.22 |
---|---|
[LetsDefend] Network Protocols 네트워크 프로토콜 - UDP (0) | 2025.02.22 |
Wireshark PCAP 파일 네트워크 파켓 분석 실습 (0) | 2025.02.21 |
Wireshark 네트워크 패킷 분석 도구 기능 (0) | 2025.02.21 |
Network Analysis :: 네트워크 장치/ 포트와 서비스 (0) | 2025.02.16 |