使用tcpdump分析TCP的三次握手和四次挥手
自我感觉网络基础太薄弱了,最近打算恶补一下,先从TCP的建立连接和断开连接开始吧。
理论知识
从课本上我们都学过TCP建立连接的三次握手和断开连接的四次挥手,网络上相关的介绍博客也很多,推荐一个博客计算机之间是如何进行通信的?;详解三次握手和四次挥手,介绍得非常透彻易懂,感谢作者。
建立TCP server和client
使用python写了两个脚本:server.py和client.py,分别使用python socket实现TCP的server端和client端,脚本非常简单,直接照搬Python 网络编程| 菜鸟教程。
server.py
import socket
import sys
import time
if __name__ == '__main__':
port = int(sys.argv[1])
s = socket.socket()
host = socket.gethostname()
print host
s.bind((host, port))
s.listen(5)
while True:
c, address = s.accept()
print 'client address:', address
print '\n'
print c.recv(1024)
c.send('reply')
time.sleep(1)
c.close()
client.py
import socket
import sys
if __name__ == "__main__":
port = int(sys.argv[1])
s = socket.socket()
host = socket.gethostname()
s.connect((host, port))
s.send('query')
print s.recv(1024)
s.close()
抓包工具
我是在Linux测试,使用的是tcpdump,命名行
$ tcpdump -S tcp -i lo port {port}
- tcp表示抓取TCP协议报文
- -i lo是抓取localhost的报文,如果不用-i lo,默认无法抓取本地环回地址(127.0.0.1)的报文。lo是ifconfig命令返回的本地环回地址网卡标记。
- port 抓取固定端口上的报文
抓包步骤
- 在第一个terminal中运行tcpdump -S tcp -i lo port {port}。
- 在第二个terminal中运行python server.py {port}
- 在第三个terminal中运行python clie