tcp 3 way handshake에 대한 이미지 검색결과



TCP 서버를 열어놓고 TCP 클라이언트로 데이터를 보내고 스니퍼로 확인해본다.



192.168.4.117의 33333번 포트로 데이터를 보내고 받는다.




'bugday' 라는 데이터를 전송하는데 총 10번의 패킷을 주고 받는것을 확인할 수 있다.

패킷을 하나하나 분석해보자.




----------------------------3 way handshake 시작-------------------------

첫번째 패킷b'\x00\x05f#0\x19\x00\x0c)o\xad\x1a\x08\x00E\x00\x00<\x90Z@\x00@\x06\x18\xf6\xc0\xa8\x0b\xa6\xc0\xa8\x04u\xda\x1c\x825\xa6\x90\x87\xdf\x00\x00\x00\x00\xa0\x029\x08\xdb\x1a\x00\x00\x02\x04\x05\xb4\x04\x02\x08\n\x00+\x17\x85\x00\x00\x00\x00\x01\x03\x03\x06'


ethernet 헤더(14)

b'\x00\x05f#0\x19\x00\x0c)o\xad\x1a\x08\x00'


IP 헤더(20)

 b'E\x00\x00<\x90Z@\x00@\x06\x18\xf6\xc0\xa8\x0b\xa6\xc0\xa8\x04u'


TCP 헤더(20)

 b'\xda\x1c\x825\xa6\x90\x87\xdf\x00\x00\x00\x00\xa0\x029\x08\xdb\x1a\x00\x00'


TCP 헤더 options(20)

 b'\x02\x04\x05\xb4\x04\x02\x08\n\x00+\x17\x85\x00\x00\x00\x00\x01\x03\x03\x06'


TCP 헤더만 분석해보자

192.168.11.166 -> 192.168.4.117

tcp.srcport : 클라이언트의 임의의 포트 

tcp.dstport : 서버가 지정한 포트 값

tcp.seqnum : 패킷이 잘 도착했나 acknum을 받기위한 4바이트 크기의 임의의 값

tcp.acknum : 처음 보내는 패킷이므로 0의 값을 갖는다.

tcp.headerlen_flag : 헤더의 크기는 options필드까지 합쳐서 40byte

                              플래그는 '000000010'로 SYN(동기화요청)


두번째 패킷

\x825\xda\x1c\x1c\x1b\xb5\x0f\xa6\x90\x87\xe0\xa0\x128\x90\x11S\x00\x00\


192.168.4.117 -> 192.168.11.166

tcp.seqnum : 클라이언트에게 패킷이 잘 전송되었나 acknum을 받기위해 서버 seqnum을 생성

tcp.acknum : 클라이언트에게 SYN(동기화요청)을 받았다는 의미로 클라이언트의

                     seqnum에 1을 더한 값을 acknum으로 돌려준다. 

tcp.headerlen_flag : 플래그 '010010' 으로 ACK/SYN(응답과요청)을 의미


세번째 패킷

192.168.11.166 -> 192.168.4.117

tcp.seqnum : 서버에서 응답한 acknum를 그대로 seqnum으로 전송

tcp.acknum : 서버 seqnum에 1을 더한 값을 acknum으로 돌려준다. 

tcp.headerlen_flag : 플래그 '010000' 으로 ACK(응답)을 의미

-----------------------------------3 way handshake 끝----------------------



 -----------------------------------데이터 전달 시작--------------------------

네번째 패킷

192.168.11.166 -> 192.168.4.117

tcp.seqnum : 다시 클라이언트가 보내므로 seqnum이 같음 

 tcp.acknum : 다시 클라이언트가 보내므로 acknum이 같음

 tcp.headerlen_flag : options필드가 12바이트(데이터제외)

                              이때 options필드 뒤에 전달할 데이터가 붙음

                              플래그 '011000'  PSH/ACK로 (데이터전달/응답)


다섯번째 패킷

192.168.4.117 -> 192.168.11.166

 tcp.seqnum : 클라이언트에게 받은 acknum을 그대로 seqnum으로 전송

 tcp.acknum : 클라이언트 seqnum + 데이터의크기(6)

 tcp.headerlen_flag : '010000'  ACK(응답)


여섯번째 패킷

192.168.4.117 -> 192.168.11.166

 tcp.seqnum : 다시 서버가 보내므로 seqnum이 같음 

 tcp.acknum : 다시 서버가 보내므로 acknum이 같음

 tcp.headerlen_flag : 플래그 '011000'  PSH/ACK로 (데이터전달/응답)


일곱번째 패킷

192.168.11.166 -> 192.168.4.117

 tcp.seqnum : 서버에게 받은 acknum을 그대로 seqnum으로 전송 

 tcp.acknum : 서버의 seqnum + 데이터의크기(6) 

 tcp.headerlen_flag : 플래그 '010000'  ACK(응답)


-----------------------------------데이터 전달 끝---------------------------

 

 -----------------------------------연결 종료 시작--------------------------

여덟번째 패킷

192.168.4.117 -> 192.168.11.166

 tcp.seqnum : 클라이언트가 보낸 acknum을 그대로 seqnum으로 전송

 tcp.acknum : 클라이언트가 보낸 seqnum을 그대로 acknum으로 전송 

 tcp.headerlen_flag : 플래그 '010001' ACK/FIN(응답/연결종료)



 아홉번째 패킷

192.168.11.166 -> 192.168.4.117

 tcp.seqnum : 서버가 보낸 acknum을 그대로 seqnum으로 전송

 tcp.acknum : 서버의 seqnum + 1 해서 acknum으로 전송 

 tcp.headerlen_flag : 플래그 '010001' ACK/FIN(응답/연결종료)


열번째 패킷

192.168.4.117 -> 192.168.11.166

 tcp.seqnum : 클라이언트가 보낸 acknum을 그대로 seqnum으로 전송

 tcp.acknum : 클라이언트의 seqnum + 1 해서 acknum으로 전송 

 tcp.headerlen_flag : 플래그 '010000' ACK(응답)

-----------------------------------연결 종료 끝------------------------








WRITTEN BY
Bugday

,