【工具篇】06. TCP 通信 ❀ 数据包分析工具 Wireshark

        【简介】TCP 是一种面向连接的协议,很多应用层协议都使用 TCP 来确保文件在传输的过程中不会出现丢包的情况。TCP 可以通过基本的序列号和确认号来确保相互通信的主机之间不会在传输过程中出现丢包的情况。


  网络环境

        为了使测试环境更加真实,我们布置了这样一个网络环境。防火墙是192.168.28.0/24网段,无线AP是192.168.38.0/24网段。

        ① 防火墙是192.168.28.0/24网段,无线AP是192.168.38.0/24网段。三层交换机与防火墙之间是172.20.1.0/24网段。服务器是172.16.2.0/24网段。工作电脑是172.16.1.0/24网段。

        ② 连接无线AP的笔记本电脑无线网卡的IP地址是 192.168.38.26 。

        ③ 笔记本电脑通过无线网卡,可以Ping通IP地址172.16.2.11的服务器。

        ④ 跟踪路由,可以看到经过无线IP网关后到达三层交换网,再找到服务器IP地址。

  Wireshark 抓包

  这里我们用最常用的方法,先抓接口包,再过滤出我们需要的信息。

        ① 启动 Wireshark ,点击WLAN接口,点击蓝色图标开始抓包。

        ② 笔记本电脑通过无线网卡,经无线AP到达飞塔防火墙,再到三层交换机,最后到Web服务器。打开了Web服务器访问界面。

        ③ 显示过滤笔记本无线网卡IP地址和Web服务器的IP地址。最前面三个数据包就是三次握手的进程。

  TCP 通信

        TCP就像一种双向的通信进程,不只发送方会参与通信,接收方也会主动参与到连接的建立当中。可以将这个过程想象为拨打电话号码,如果拨电的电话号码是对的,那么对方就会听到电话铃声,只有对方接听了电话,通话才会开始。同样,TCP通信过程中,通信的双方会执行一个称为三次握手的进程,以便在通信过程中在参与通信的两台主机之间创建出一条独立的通首。

        我们来看看三次握手中的第一次。

        ① 整个TCP包的长度是66个字节。

        ② 前面的14个字节为以太网帧头。

        ③ 跟着的20字节为IP帧头。

        ④ TCP 头部的长度通常为20字节,但在有些情况下,由于TCP头部中有一些可选字段,所以TCP头部的大小也有可能增至60字节。这里看到有12字节为可选。

        下面我们看看TCP头部有哪些内容:

        Source Port(源端口):发送方使用的端口号,也可以说是发送方应该负责监听的端。

        Destination Port(目标端口):接收方使用的端口号,这里在Web访问时加入了8080端口号。

        Sequence number(序列号):这是用来确保数据可靠传输的一个唯一值。TCP会使用序列号来追踪每个数据段的传输情况。

        Flags(标记):标记有很多不同类型,这些不同类型代表不同的意义。这里我们看到有三个标记,SYN、ECN、CWR。

        SYN(同步):这些是用来发起连接的数据包,这里的连接也就是我们平时所说的握手进程。

        ECN(显示反馈):在传输层(TCP),TCP端必须对对方表明自身是可以进行ECN操作的。接收端必须能够通知发送端它收到了一个来自路由器的拥塞通告。发送端必须能够通知接收端它受到了来自接收端的通告并且已经降低了发送速率。

        CWR(拥塞窗口减小):发送方会使用这些数据包向接收方通告:由于传输导致缓冲区已经满或由于拥塞,通信各方都应该降低传输的速度,以避免网络中因些产生丢包。

        Window Size(窗口大小):头部的这个字段表示的是发送方可以发送的数据冲量。这个总量是在握手的过程中决定的,因为在握手的过程中,通信双方的主机会匹配缓冲区的大小。通信设备可以通过这个字段实现流控。

        Checksum(校验和):要想反复判断接收数据的完整性,就要使用这个字段。这个字段可以让通信方确认TCP数据段中的内容是否发生了变化。

        Urgent Pointer(紧急指针):这个字段的作用是告诉另一方紧急指定中包含的数值。这个参数会明确显示数据之前的十六进制序列号。

        Options(可选项):这个字段的长度视可选项的数量而定。这个字段中包含3部分,其中第1部分标识可选项字段的长度,第2部分标识了数据包中的使用可选项,第3部分则直接包含了这个数据包所使用的可选项。

        ⑤ 再看第二次握手进程,第一次内容有些不同。多了一个确认号,另外标记里除了有SYN(同步)之外,还有一个ACK标记。

        Acknowledgment number(确认号):这是通信的接收方在响应时发送的数值。这个数值的作用是确认这个数据包已经成功接收到了。(在发送方的序列号上加1)

        ACK(确认):这些数据包的作用是确认自己已经接收到了数据包,这些数据包也会用来发起和断开连接。

        ⑥ 第三次握手,确认收到对方回传的信息,这个时候不再需要可选项,长度少12字节,信道建立成功,可以开始传输数据了。

  读取数据

        示例是访问Web服务器。

        ① 在信道成功建立之后,客户端会发送一条 Get 请求消息,以访问Web根目录中的内容。服务器通过 200 状态消息确认向客户端发送了其请求的内容,而客户端则会通过下一个数据包来确认自己收到了这些内容。

        ② 针对文件传输,会建立多条信道。

  连接断开

        在成功传输了所有请求的数据包之后,服务器就会启动断开进程。

        ① 首先服务器向客户端发送断开请求,客户端会用下一个数据包进行确认。然后客户端会用相同的方式发关断开请求,而服务器收到这个消息后这进行了确认。

        ② 服务器发出断开请求。标记里有个FIN。

       FIN(结束):这些数据包表求,在数据包通过当前的连接成功传输完毕之后,连接正在断开。发送方和接收方都要通过发送FIN数据包来终止连接。

        ③ 客户端确认收到要求断开信息,确认号在发关来的序列号上加1。

        ④ 现在轮到客户端发送断开请求。

        ④ 服务器端确认收到消息,信道断开了。


为什么要开发Tcpdive        在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化。  用户接入网络的方式,除了宽带和光纤之外,还有2G/3G/4G/WiFi,5G也已经在路上了。  作为使用范围最广的传输层协议,TCP诞生于固网时代,在设计之初并没有考虑到上述种种情况,  这导致了它在某些场景下,性能并不是最优的。因此大多数的CDN厂商和一些规模较大的互联网公司都会  进行TCP协议的优化,以提供更好的用户体验,如更快的访问速度,更低的访问失败率,更流畅的视频播放等。 而当我们尝试优化TCP协议时,却面临着不少难点: 可用的工具少。  和TCP相关的工具,比如tcpdump,netstat和ss,虽然很好用,但是使用场景并不是TCP协议的性能评测,  能够提供的性能信息实在有限。 依靠个人感觉,进行盲试。  不知道瓶颈在哪,盲目修改,或者直接套用已有的优化方法。  盲目修改常导致徒劳无功,直接套用现成的方法,由于大家的应用场景不尽相同,也不一定有效。 测试成本高。  对TCP协议的性能评测主要采用两种方法。  一种是通过对上层应用的测试,来评估TCP协议的性能。这种方法的评价指标有限,而且是上层应用相关的。  另一种是依靠第三方测试服务。这种方式的样本量有限,且成本较高。 无法准确地评价优化效果。  上述的两种测试方法,都涉及到应用层面,因此测量的不仅仅是TCP协议本身,还参杂了干扰因素。   Tcpdive的设计目标        针对上述问题,我们决定设计一个专门的TCP协议性能评测工具,也就是Tcpdive。  之所以起这个名字,是因为dive有深入研究的意思:) Tcpdive具有一些特性,实际上也是我们的设计目标: 对TCP协议的性能进行较为全面的刻画,有助于发现瓶颈。  如此一来,就能找到痛点,不用再盲目地进行优化。 易于部署和使用,无需改动生产环境,使用成本低。  这一点非常重要,因为不需要修改内核或者应用程序,比较容易推广。 独立于上层应用,能够准确地评价优化效果。  直接对TCP协议的性能进行刻画,而不依赖于具体的应用。  因此能够排除上层应用的干扰,量化地评价优化效果。   Tcpdive的基本原理        Tcpdive是基于linux内核的探测点机制,使用systemtap脚本语言和内嵌C代码来实现的。  通过定义几类相互关联的探测点和库函数,来收集和处理运行中内核的数据,以及修改内核的处理逻辑。         为什么要基于systemtap呢?systemtap的神奇之处在于,不修改内核的情况下就能获取内核中的任何信息, 还可以修改内核的处理逻辑。所以虽然被它虐了千百遍,但还是觉得这套探测点机制非常有用。当然它也不是 十全十美的,比如作为一种调试语言,它是够用的,但是把它用作一种开发语言,则会遇到不少问题。通过不 断的尝试,大多数问题最终都获得比较好的解决。         目前Tcpdive已经部署到作为流量入口的负载均衡服务器上,在新浪的线上环境7*24h运行,可以说是比较稳定的。 Tcpdive的主要功能 作为一个TCP协议的性能评测工具Tcpdive提供了大量的性能指标,从以下维度来对每条TCP连接进行刻画: 传输情况 丢和重传 拥塞控制 HTTP处理   传输:   损失和重传: 拥塞控制: HTTP 处理:     标签:tcpdive
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞塔老梅子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值