用 Wireshark 让你看见 TCP 到底是什么样

前言

当你看到这篇文章时,你只能看到已经渲染好的文字和图像,而网络数据的交互对我们来说,却是看不见的,所以学习计算机网络原理的时候就会觉得非常的抽象,这一度让我苦恼。

而且网络数据交换真实的模样,到底是不是真的如大多数文章所描绘的一样?

这些疑问让我早就想干这件事了。

所以不如就去看看离我们最近的协议 TCP 到底长什么样?

为了能“看见”TCP,我们需要借助 Wireshark 分析网络的利器。

WiresharkWindows 最常用的网络抓包和分析工具,称得上手好剑大利器把我们对数据包一目了然。 (也是分析网络性能必不可少的利器)

如果是在 Linux 上网络抓包,那可以使用 tcpdump

(分析网络的工具还有很多,但是工具只是手段,重要的是能实现目的)

初试牛刀:解析各层协议栈

我们可以先在浏览器请求一个网址(xxx.com),然后通过 Wireshark 就可以直观的看到分析数据包的页面,其中就展示了各个网络包的头部信息。

如下图所示,协议一栏可以看到,我们这次抓包主要是 TCP 协议。

接下来,选中某一个网络包后,在下面可以清楚的看到有网络包的各行信息,分别对应TCP/IP协议的不同层级。以下图为例,分别表示:物理层、数据链路层、网络层、传输层

应用层如果有数据会显示第5层,即一共会出现5层。

可以对应到我们之前的TCP/IP模型。

  • 应用层
  • 传输层
  • 网络层
  • 网络接口层

然后,接着再往下,可以更清楚的看到各行信息其实就是各层协议栈的详细信息。

数据链路层 里的 MAC 头信息,以及源 MAC 地址和目标 MAC 地址字段等等;

IP 层 里看到 IP 头信息,以及Version 4 表示的是IPv4协议(互联网通信协议第四版),Src Port 表示的是网卡的ip地址,Dst Port表示服务器的ip ,以及包长度等 IP 协议的各个字段的值和含义;

还有 TCP 层 里看到 TCP 头信息(这个我们后面展开细说);

Wireshark 让我们看到了各个分层的方式,以及每一层都有一个字段指向上一层,表明上一层是什么协议。

因为发送数据包的时候会在数据上依次加上应用层、传输层、网络层、链路层的头部,但是对方收到数据包后是从最底层开始层层剥去头部解包的,所以在每层上有一个字段指向上层,表明上层的协议,对方就知道下一步该怎么解包了。

我们可以看到网络分层就像有序的分工,每一层都有自己的责任范围和信息,上层协议完成工作后就交给下一层,最终形成一个完整的网络包。

所描绘的这样。

回过头来看真实 TCP 头格式

接着我们来看在上篇中的 TCP 报文头部的格式,真实的TCP 报文头部的格式是不是也是这样?

接着来,可以继续选中Wireshark中的TCP(Transmission Control protocol)层,可以清楚的看到以下几点信息:

  • 源端口目标端口,而TCP的包是没有IP地址的,毕竟那是IP层上的事。
  • 以及 TCP连接所需的四个字段,表示是同一个连接(src_ip, src_port, dst_ip, dst_port)。

如图所示(源端口是63123,目的端口是443;443则表示是HTTPS协议)

还有如下图所示。在 Wireshark 中可以看到 TCP 头格式中四个非常重要的字段:

  • Sequence Number序号,数据包的序号,用来解决网络包乱序问题。
  • Acknowledgement Number,ACK——确认收到,用来解决不丢包的问题
  • Window(Advertised-Window),著名的滑动窗口(Sliding Window),用于解决流控的
  • Flags ,是包的状态,主要是用于操控TCP的状态的

接着打开TCP中的Flags(状态位)的可以看到 6个状态位,分别是ACK、SYN、FIN、URG、PSH、RST,如果是1表示有效。

而比较主要的是SYN、ACK和FIN。SYN(SynchronizeSequence Numbers)表示建立连接时的同步信号;ACK(Acknowledgement)表示对收到的数据进行确认;FIN (Finish)表示后面没有数据需要发送,则意味着释放所建立的连接。

在上图中,Flags中的UTG是紧急指针。只有当URG标志置为1时该字段才有效,可以告诉系统报文有紧急内容。

在状态位下还有一个强制性的字段 Checksum 校验和是由发送端计算和存储,由接收端进行验证。目的是为了发现 TCP 首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验有差错,TCP 段就直接丢弃。

好了,用 Wireshark 让你看见 TCP 到底是什么样的,后面还可以接着Wireshark看更多东西,例如TCP建立连接和释放连接,真正又是怎么样三次连接,四次挥手的?

相关文章

3000字讲讲TCP协议,握手挥手不是你想的那么简单

专注于Java领域优质技术,欢迎关注作者: tobe 来自:tobe的呓语上一次讲了 UDP 协议,从这次开始,就要讲 TCP 协议了,因为 TCP 协议涉及到的东西很多,一篇文章概括不完,所以我把...

Java编程-TCP JAVA编程手机软件

1.1. Java的TCP面向连接, 数据安全, 区分服务器端和客户端.TCP分为Socket(客户端)和ServerSocket(服务端)需要分别建立客户端和服务器端客户端和服务端建立连接后,通过S...

Java网络编程---TCP通信 java的tcp通讯协议数据传输

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信Java对基于TCP协议的网...

4000 字详解TCP超时与重传,看完没收获算我输

专注于Java领域优质技术,欢迎关注作者: tobe 来自:tobe的呓语上一篇介绍 TCP 的文章「TCP 三次握手,四次挥手和一些细节」反馈还不错,还是蛮开心的,这次接着讲一讲关于超时和重传那一部...

一文带你搞定TCP流量控制 tcp流量控制算法

摘要理想的流量控制实际的流量控制窗口关闭糊涂窗口综合征理想的流量控制什么是流量控制?流量控制就是发送方不能无脑的给接收方发送数据,它需要根据接收方的处理能力来发送数据。理想下的流量控制?理想意味着在实...