명령어
/usr/sbin/tcpdump -X -vvv -n -w [dumpfile 생성 위치] -i any -s 0
서버를 실행합니다.
위의 명령어를 실행합니다.
클라이언트에서 연결요청과 함께 메시지를 보냅니다.
서버에서 클라이언트로 부터 메시지를 받았습니다.
2번에 실행한 dump 생성 프로세스를 종료하고 dump file이 생성된것을 확인합니다.
현재 저의 작업환경은 회사내 서버 컴퓨터로 작업하여 로컬에 파일을 옮겨서 확인해야합니다.
파일을 옮기기 위해 filezila를 사용해서 옮겨보겠습니다.
사이트 관리자를 열어 새 사이트를 만듭니다.
프로토콜, 호스트, 포트, 사용자, 비밀번호 등 정보를 입력해줍니다.
원하는 파일을 찾아서 드래그로 옮겨줍니다.
이렇게 통신 내용을 확인할 수 있습니다.
저는 제가 직접 제어한 통신내역을 확인하기위해 8888포트로 연결하고 해당 포트를 찾아 -> 우클릭 -> follow -> tcp stream을 눌러 아래와 같은 창을 볼 수 있었습니다.
4번째 라인이 클라이언트 -> 서버 hello를 보낸 부분이고
6번째 라인이 서버 -> 클라이언트 Hello from server를 보낸 부분입니다.
c -> s로 연결을 위해 syn을 보냅니다. 이때 data는 없으므로 seq = 0입니다.
연결을 위한 syn와 잘 받았다는 의미의 ack를 보냅니다.
이때 ack는 받은 syn가 0이기 때문에 seq 값에 1을 더한 값을 ack로 보냅니다.
클라이언트는 서버로부터 ack 값이 1인 패킷을 잘 받았다는 의미로 seq에 1을 담아 보냅니다. 이때 ack값은 받은 ACK 패킷의 seq값이 0이기 때문에 1이 됩니다.
연결이 되었으니 클라이언트에서 hello를 보냅니다.
이때 PSH 플래그가 같이가며, 이는 tcp 버퍼에 쌓지말고 4계층에서 7계층으로 메시지를 바로 올려보내라는 의미입니다.
hello]\n 6글자를 받은 서버는 클라이언트의 seq 1에 data size 6을 더해 7의 값으로 ack를 보냅니다.(5번 라인) 이후 서버는 Hello from server라는 메시지를 보냅니다. (6번 라인)
클라이언트는 서버의 ack를 잘 받았고 그 응답이라는 의미로 seq에 받은 ack값인 7과, ack에는 받은 ACK패킷의 seq 1값에 보내는 글자수 17을 더해 ack에 18값을 주어 보냅니다.
프로그램이 종료되며 클라이언트는 fin 패킷을 서버에 보냅니다.
서버도 연결을 종료하겠다는 fin에대한 ack를 보냅니다.
클라이언트는 해당 패킷을 받았다는 ack를 보냅니다.
서버 또한 완전하게 연결을 끊었다는 ack를 보냅니다.