当前位置: 首页 > news >正文

北京网站开发建设/软文营销文章

北京网站开发建设,软文营销文章,做网站参考线怎么拉,宣传片拍摄报价明细奇技指南笔者最近看了关于Python的部分内容,发现网络编程部分非常容易能够创建一个本地TCP服务器,正好可以用来分析一下TCP的请求和响应过程。在本篇文章,笔者将给大家介绍下TCP建立连接(三次握手),传输数据,断开连接(…

奇技指南

笔者最近看了关于Python的部分内容,发现网络编程部分非常容易能够创建一个本地TCP服务器,正好可以用来分析一下TCP的请求和响应过程。
在本篇文章,笔者将给大家介绍下TCP建立连接(三次握手),传输数据,断开连接(四次挥手)的过程。

本文来自公众号360云计算。

TCP简介

  • TCP:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

  • 聊到网络协议,我们常常会想到OSI(Open System Interconnection 开放式系统互联)七层模型、TCP/IP协议簇,她位于OSI、TCP/IP协议簇哪一层等问题。
    如下图OSI七层模型及对应的TCP/IP协议簇所示,TCP位于OSI中的第四层(传输层)。位于TCP/IP协议簇中的第四层(TCP or UDP)。

下图为OSI七层模型及对应的TCP/IP协议簇

6c2af64e4fac22ee501a9da8f3a6841f.png

OSI TCP/IP Family

  • TCP是面向连接的,是指客户端在发送、接收数据之前需要先建立连接,这个连接过程需要三次握手来完成,笔者借助Python搭建了一个本地的TCP服务,并使用Wireshark(Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。)

    捕获了本地的TCP服务器和TCP客户端之间请求响应的过程,带大家一起看一下建立连接(三次握手),传输数据,断开连接(四次挥手)的过程。

本地搭建TCP服务准备工作

笔者在前文提到了要用Python创建一个本地TCP服务器,并且分析TCP的请求响应过程。这里笔者使用的是PythonIDE、Mac自带的终端简单创建了一个本地TCP服务端和客户端。

笔者会分析的过程如下:

-> 创建并且启动一个端口号为20000的TCP服务端
-> 创建客户端并和服务端建立连接(三次握手)
-> 客户端向服务端发送数据'AB'
-> 服务端到数据后给客户端发送数据'AB'
-> 服务端收到数据向客户端发送收到的数据(当前即'AB')
-> 客户端和服务端断开连接(四次挥手)
-> 使用Wireshark对建立连接(三次握手),传输数据,断开连接(四次挥手)的过程进行分析

服务端代码:

Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 03:13:28)

[Clang 6.0 (clang-600.0.57)] on darwin

Type "help", "copyright", "credits" or "license()" for more information.

>>> from socketserver import BaseRequestHandler, TCPServer

>>> class EchoHandler(BaseRequestHandler):

def handle(self):

print('Got connection from', self.client_address)

while True:

msg = self.request.recv(8192)

if not msg:

break

self.request.send(msg)

>>> if __name__ == '__main__':

serv = TCPServer(('', 20000), EchoHandler)

serv.serve_forever()

Got connection from ('127.0.0.1', 59006)

客户端代码:

wangyongwangdeiMac:~ wangyongwang$ python

Python 2.7.15 (default, Oct 2 2018, 11:47:18)

[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.2)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> from socket import socket, AF_INET, SOCK_STREAM

>>> s = socket(AF_INET, SOCK_STREAM)

>>> s.connect(('localhost', 20000))

上述代码的效果如下图所示:

04d18a8f2bde4d801aa2171397cc5874.png

TCP请求响应效果图

57cdd1d15a7a8d518ddc1b1d96e0a2ce.png

TCP建立连接效果图

如上图,Got connection from ('127.0.0.1', 62515)我们可以确定客户端使用的端口是59006。

通过上述准备工作,下边笔者会使用Wireshark捕获TCP请求响应的整个过程,并进行相应分析。

TCP三次握手

  • TCP通过三次握手建立连接,我们对下图应该比较熟悉:

9c8616b078bf53c82a59d2a7a5201bc0.png

TCP三次握手图解

对上图中的代号及下文中的代号做说明:

Seq即下文中的Sequence number ,序列号是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。一般用Wireshark捕获我们平时的请求的Seq是一个随机数。

Ack 即Acknowledgement number,是指下一次应该受到的数据的序列号。

SYN为Flags部分的Syn,Syn为1表示希望建立连接。

ACK为Flags部分的ACK,Ack为1表示确认应答的字段变为有效。

TCP第一次握手,客户端向服务端发送报文,关键信息为Syn=1,Seq=0。如下图所示,sequence number= x = 0,Syn=1。

36328364355176b9befad8dc82e96f84.png

TCP第一次握手

TCP第二次握手,服务端向客户端发送报文,关键信息为Ack=x+1=1,Syn=1,Seq=y=0。如下图所示,sequence number=y=0,Ack=x+1=1 , Syn = 1。

ab48fd70cd68e5773a31f3fab1501630.png

TCP第二次握手

TCP第三次握手,客户端向服务端发送报文,Seq=x+1=1,Ack=y+1=1,ACK=1。如下图所示,Seq=x+1=1,Ack=y+1=1,ACK=1。

98022477f5b9deb6e2039216ac728eac.png

TCP第三次握手

我们可以发现在三次握手之后,还有一次TCP Window Update。

71c9b01e9baaa6d4ae760bf2e71becad.png

TCP Window Update

TCP Window Update 是TCP通信中的一个状态,它可以发生的原因有很多,但最终归结于发送者传输数据的速度比接收者读取的数据还快,这使得接受端的在缓冲区必须释放一部分空间来装发送过来的数据,然后向发送者发送Windows Update,告诉给发送者应该以多大的速度发送数据,从而使得数据传输与接受恢复正常。参考:tcp三次握手

从上图TCP Window Update,根据Source Port:20000及Destination Port:59006可知,当前发送者是客户端,解释下上一段文字的意思是,客户端发送的数据太快,服务端读书数据慢,服务端向客户端发送了一个TCP Window Update的报文。

0fdb1f9f8a97bd086e09549e1db56f22.gif

上述内容就是TCP建立连接的过程,下边笔者给大家介绍下传输数据部分的内容:

TCP的数据传输过程

查看数据传输过程和之前建立连接部分,用的是下图代码进行的分析:

7092e9e79e7358d411c016694707986c.png

代码内容和之前建立连接的代码一样,只是添加了发送数据和断开连接的几行代码。可见这次客户端分配的端口号为53262。


在分析数据传输过程之前,笔者先对下边会用到的名词及工具做个简单说明:

字节即byte,比特即bit,1个字节(byte)=8个比特(bit)。

ASCII码:是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统

ASCII码对照表

举个例子'A'的ASCII码为0x41

基本的16进制、2进制、10进制之间的转换

16进制0x41对应2进制为 0100 0001对应10进制为4 * 16 + 1 = 65

在线进制转换

下边笔者带大家看一下数据传输部分的分析:

下图表示客户端s.send(b'A')以二进制形式传输'A'(其对应的ASCII码为65)传输过程:

0768067caa70d133533d64e6a58a9714.png

客户端到服务端

下边展示一个客户端s.send(b'AB')并且服务端给予相应的回应(服务端也给客户端发送收到的'')的过程

  • 接收数据的部分Flags中的Acknowledgement 设置为1,表示确认应答的字段有效

  • 接收数据的部分Flags中的Push 设置为1表示表示接收方应该尽快把数据传给上层应用协议

从源端口53262,目的端口20000可以看出,下图表示客户端向服务端发送消息,发送的数据为'AB','AB'的ASCII码为0x4142。

80430d21cf30181ab806c675023b9462.png

客户端向服务端发送消息

从源端口20000,目的端口53262可以看出下图表示服务端向客户端反馈收到了消息。

Acknowledgement number 为4是因为,服务端接接收了客户端的2个字节的数据,在之前的客户端的Sequence number的基础上加了2。

c566bf0d3aa7ac7dab777a27739cfca9.png

服务端到客户端收到消息响应

从源端口20000,目的端口53262可以看出,下图表示服务端向客户端发送消息,发送的数据为'AB','AB'的ASCII码为0x4142。

ba5b964037556b761f8a855ebf0eeeff.png

服务端给客户端发送消息

从源端口53262,目的端口20000可以看出下图表示客户端向服务端反馈收到了消息。Acknowledgement number 为4是因为,客户端接收了服务端的2个字节的数据,在之前的服务端的Sequence number的基础上加了2。

cc9aab2f2b9af657d158428198227ce5.png

客户端收到服务端消息后的响应

TCP断开连接四次挥手

TCP断开连接示意图如下:

ed84a25601a8c731b23cf95474d68970.png

TCP断开连接示意图

对应的Python的客户端代码s.shutdown(2),客户端主动断开连接的。

  • 断开连接的Flags中Fin是设置为1的,表示希望断开连接。

  • 断开连接的Flags中Ack是设置为1的,表示确认应答字段有效。

响应的Wireshark抓包分析如下:


TCP断开连接第一次挥手,从源端口53262到目的端口20000,可以看出是客户端主动断开连接的。Flags中的Fin是设置为1的,Sequence number为7。

df6ea3c5775e55a39213d62f83c05b2b.png

TCP断开连接第一次挥手

TCP断开连接第二次挥手,从源端口20000到目的端口53262,可以看出是服务端给予客户端断开连接的响应。并且Acknowledge number对之前的客户端的Sequence number做了加1操作。

fe39eef300c0c0c6151e659e996703fe.png

TCP断开连接第二次挥手

TCP断开连接第三次挥手,从源端口20000到目的端口53262,Flags中的Fin是设置为1的,可以看出是服务端向客户端发送断开连接的。Sequence number为7。

a751cc1d0459839a3fb24f401ba29a19.png

TCP断开连接第三次挥手

TCP断开连接第四次挥手,从源端口53262到目的端口20000,可以看出是客户端给予服务端断开连接的响应。并且Acknowledge number对之前的服务端的Sequence number做了加1操作。

685382a3aceaea83fbeefd80a509fb94.png

TCP断开连接第四次挥手

198d4270f2554adbfeb01ae2328d54d5.png

下边,笔者贴出了IP和TCP首部及Wireshark捕获TCP请求过程的的图。有兴趣的读者可自行做简单分析。

3bc6155f2a9d153014ae5d4cb06760c4.png

TCP数据在IP数据报中的封装及TCP包首部

  • 后来和昆哥一起交流,经过昆哥指正,上图的TCP首部已经更新过了,较新的TCP首部格式如下:

1feab6192488a4a1df1a472ef23c3b1a.png

TCP首部

下图为TCP首部中的控制位部分

2904b8326cc24a7ec4480043355394cc.png

控制位 Control Flag

14e4ab04129a3de87f26a66959335104.png

TCP

956b5a84bd6b982bbcd2aa7ff3e48d42.png

TCP

参考内容

  • Wireshark数据包实战讲解

  • TCP/IP详解

  • 图解TCP/IP

  • https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.halc001/ipcicint_protocol.htm

  • https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml

  • https://python3-cookbook.readthedocs.io/zh_CN/latest/c11/p02_creating_tcp_server.html#id1

界世的你当不

只做你的肩膀

ee1b6629055e20d4b0f8fd17913571ab.png04a1a02b14bee48d863d4dbd4c9b9b06.png

 360官方技术公众号 

技术干货|一手资讯|精彩活动

空·

http://www.lbrq.cn/news/1598185.html

相关文章:

  • 自己做网站的图片/中国十大搜索引擎排名最新
  • 中国容桂品牌网站建设/百度app内打开
  • 牡丹江做网站的公司/电商网站建设公司哪家好
  • 建筑工程网登/网站seo优化技巧
  • 服务器不是自己的做违法网站/青岛的seo服务公司
  • discuz修改网站底部/百度网站名称和网址
  • 广州宝盈网络科技有限公司网站/郑州网站优化排名
  • wordpress php 5.2/seo搜索优化是什么
  • 设计一个网站的步骤/沈阳优化网站公司
  • 给赌博网站做设计/18岁以上站长统计
  • 电子商务网站建设的基本要素/aso优化分析
  • 阿里云做网站要几天/销售网络平台推广
  • 买下云服务器怎么做网站/如何推广自己产品
  • 深圳市住房城乡建设局网站/做一个公司网站需要多少钱
  • 浙江网站建设推广公司哪家权威/网站免费高清素材软件
  • 企业做网站需要哪些人员/免费下载百度
  • 四川省住房与城乡建设 厅网站/谁有恶意点击软件
  • 宝塔怎么做两个网站/网站推广平台有哪些
  • 网站搭建吧/盘多多搜索引擎入口
  • 北京市住房和建设委员会网站/重庆seo技术博客
  • 专门做资产负债表结构分析的网站/交换友链平台
  • 建湖哪家专业做网站/模板建站
  • 莱阳网站定制/网站检测
  • 新建网站做优化/西地那非片的功能主治和副作用
  • 淘宝客推广网站源码/网站seo入门基础教程
  • 外贸站外推广/百度搜索引擎优化的方法
  • 天津做网站认准津坤科技/沈阳seo关键字优化
  • 云南专业建网站/常见的微信营销方式有哪些
  • 盘锦网站建设流程/seo排名查询
  • 枣庄市建设局网站/临汾网络推广
  • Docker Desktop
  • uniapp基础(五)调试与错误
  • android内存作假通杀补丁(4GB作假8GB)
  • 音视频学习笔记
  • 开源的现代数据探索和可视化平台:Apache Superset 快速指南 Quickstart
  • C++编译过程与GDB调试段错误和死锁问题