tcpdump로 패킷 확인하기

jinwook han·2022년 8월 14일

tcpdump로 패킷을 확인하는 실습을 한다.

채팅 서버와 클라이언트 구조에서 (1) 연결을 맺음 (2) 채팅 (3) 연결을 끊는 과정까지 tcpdump로 패킷을 캡처할 것이다.

tcp server & client

간단한 tcp server와 client를 준비했다.
https://github.com/jinwookh/linux-c-example/tree/main/chapter-bonus-tcp-chat

tcp 소켓으로 read/write하는게 전부인 어플리케이션이다.
port는 3456으로 코드에서 고정했다.

tcpdump 실행

tcpdump를 실행한다.

tcpdump -i lo0 -nn -w result.pcap tcp port 3456

https://www.tcpdump.org/manpages/tcpdump.1.html
-i: dump해야하는 인터페이스를 정한다.

localhost->localhost 통신을 하는 패킷을 뜨기 위해서 -i lo0 옵션을 추가했다.
https://stackoverflow.com/questions/3130911/tcpdump-localhost-to-localhost

tcp server / client 실행

  1. tcp server를 실행한다.
  2. tcp client를 실행한다.
  3. client에서 hello 입력
  4. server에서 hi 입력
  5. tcp client를 종료한다.(ctrl+c)
  6. tcp server를 종료한다. (ctrl + c)

pcap 확인

tcpdump를 종료하자.
그러면 tcpdump가 실행된 디렉토리에서 result.pcap이 생긴 것을 확인할 수 있다.

result.pcap을 wireshark로 열어보자.

3 way handshake(통신 시작),데이터 송수신, 4 way handshake(통신 종료)를 모두 확인할 수 있다.

3 way handshake(통신 시작)

데이터 송수신

client-> server,
server -> client로 각각 채팅 내용을 한 차례씩 발행했다.

4 way handshake(통신 종료)

Bonus

connection이 fail하는 과정에서 패킷들은 어떤 모습일까?

  1. server를 내리고, 3456 port에 listen하는 프로세스가 아무것도 없도록 설정한다.
  2. tcpdump 실행
    tcpdump -i lo0 -nn -w connectionFail.pcap tcp port 3456
  3. curl localhost:3456 실행
    다음과 같은 에러가 날 것이다.
    ```
    curl: (7) Failed to connect to localhost port 3456: Connection refused
    ```
  4. tcpdump를 종료한다.

pcap을 wireshark로 확인:

RST 패킷을 수신하여 강제로 커넥션이 종료됐다.
왜 RST 수신 이후 SYN이 한 번 더 발신됐는지는 잘 모르겠다..

0개의 댓글