【摘要】本文重点分析计算机网络中TCP协议中的握手和挥手的过程。
前段时间突然看到了一篇关于TCP/IP模型的文章,心想这段时间在家里也用wireshark抓了点包,那么想着想着就觉得需要复习一下网络知识,于是就有这篇博文的诞生。当然网上关于TCP相关的知识点也是芸芸,闲着无事也可以多google深入理解一下,本文重点在分析TCP协议中的握手和挥手的过程。
既然要抓包,我的装备是个人电脑,操作系统是Mac OS。抓包工具是wireshark,至于怎么安装和一些基本的操作,可以点击参考这篇文章。
用本地电脑模拟server和client,都是localhost的地址,但是我选择的是不同的端口进行标识。server的端口号:12345;client的端口号:50784。因为是用的本机做的实验,所以wireshark监听的不是网卡而是Loopback:lo0,如图所示:
以下是我模拟client和server的代码:
1)server端
-Python 代码 01 #! /usr/bin/python 02 # -*- coding: utf-8 -*- 03 04 import socket 05 06 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 07 08 server_address = ('127.0.0.1', 12345) 09 print "Starting up on %s:%s" % server_address 10 sock.bind(server_address) 11 12 sock.listen(1) 13 14 while True: 15 print "Waiting for a connection" 16 connection, client_address = sock.accept() 17 18 try: 19 print "Connection from", client_address 20 21 data = connection.recv(1024) 22 print "Receive '%s'" % data 23 finally: 24 connection.close()
2)client端-Python 代码
01 # /usr/bin/python 02 # -*- coding: utf-8 -*- 03 04 import socket 05 06 def check_tcp_status(ip, port): 07 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 08 09 server_address = (ip, port) 10 print 'Connecting to %s:%s.' % server_address 11 sock.connect(server_address) 12 13 message = "I'm TCP client" 14 print 'Sending "%s".' % message 15 sock.sendall(message) 16 17 print 'Closing socket.' 18 sock.close() 19 20 21 if __name__ == "__main__": 22 print check_tcp_status("127.0.0.1", 12345)
代码比较简单,就是模拟了一次链接,可以多次执行client,client只要链接成功就会发送一句话“I'm TCP client”,server一直死循环监听端口,并将接受到的信息打印到console中。
看到上面的console输出之后,我们看一下wireshark抓到的结果:
我用两种颜色标了出来,可以看到黄色框中的序号为1、2、3的三次通信过程其实就是我们说的三次握手;握手建立之后的序号为4、5、6便为传输数据的过程;而序号7、8、9、10就是我们所说的四次挥手的过程。
我们再进一步细看下握手、挥手这俩过程。
三次握手
我们来总结一下握手的规律:
四次挥手
接着总结下挥手的规律:
注意个规律: 每次一方返回ACK报文的时候,设置Ack=对方传来的Seq值+1。
说完TCP协议之后,不能免俗的要聊一下TCP/IP协议模型,该模型是计算机网络的经典的模型了。该模型由OSI模型演化而来,由原来的7层简化为了5层,具体如下图所示:
TCP/IP协议被称为传输控制协议/互联网协议,又称网络通讯协议(Transmission Control Protocol)。是由网络层的IP协议和传输层的TCP协议组成,是一个很大的协议集合。
TCP/IP的网络模型分层思想算是非常有借鉴性的系统分层思想。映射到我们的软件系统上来看,其实我们的软件系统更多的时候也需要考虑分层,层次之间通过接口来交互。在严格的分层系统里,内部的层只对相邻的层次可见,这样就可以将一个复杂问题分解成增量步骤序列。由于每一层最多只影响两层,也给维护带来了很大的便利。
参考资料:
http://www.cnblogs.com/linyfeng/p/9496126.html
http://zhuanlan.zhihu.com/p/33797520
blog.csdn.net/zhzdeng/articlehttps://img.qb5200.com/download-x/details/53490386
点击关注,第一时间了解华为云新鲜技术~