tcpdump로 패킷 확인하기

jinwook han·2022년 8월 14일
0

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개의 댓글