网络协议感觉晦涩难懂?什么七层网络模型?又五层网络模型?又四层网络模型?TCP/IP协议是个啥?UDP是啥?什么是三次握手?什么是四次挥手?tcpdump听说是抓包的,怎么用?能怎么抓包?又作用在那一层呢?
这篇文章一站解答,走起:
- 什么是网络?
- OSI七层网络模型
- 五层/四层网络模型
- TCP/IP协议
- TCP、UDP是啥?
- 三次握手/四次挥手
- tcpdump抓包应用
- Wireshark 应用
什么是网络?
百度百科说:
网络是由若干节点和连接这些节点的链路构成,表示诸多对象及其相互联系。
在1999年之前,人们一般认为网络的结构都是随机的。但随着Barabasi和Watts在1999年分别发现了网络的无标度和小世界特性并分别在世界著名的《科学》和《自然》杂志上发表了他们的发现之后,人们才认识到网络的复杂性。 [1]
网络会借助文字阅读、图片查看、影音播放、下载传输、游戏、聊天等软件工具从文字、图片、声音、视频等方面给人们带来极其丰富的生活和美好的享受。
维基百科说:
计算机网络(英语:computer network),通常也简称网络,是指容许节点分享资源的数字电信网络[1]:1-3。在电脑网络,电脑设备会透过节点之间的连接(数据链路)互相交换数据,即收发接收和发放网络信息。传输介质可分为有线及无线两类——有线的可用到双绞线、光纤电缆等介质[1]:1-4;无线则可用到Wi-Fi、NFC和Bluetooth等。
用于创建、路由及终止数据传输的电脑网络设备即为网络节点[2]。节点包括像个人电脑、电话、服务器般的主机及其他网络硬件(如网关及路由器)[1]:2-15。它们一般以网络地址作标识符[1]:2-15。当一个设备能够与另一设备交换信息时,便可视它们俩已连接成网络,不论它们是否直连[1]:1-3。专用通信协议在大多数分层中位于其他更通用的通信协议之上。要维持网络的可靠性,便需要有一定的网络管理技能。
电脑网络为海量应用程序及服务背后的基础。比如访问互联网、数字视频、数字音频[1]:4-p.21-29;共享打印机[3]:1-3;收发电子邮件及即时通信消息[1]:4-p.21-29。电脑网络可依照传输介质、传输协议、 网络大小、拓扑、流量控制机制、创建目的等因素区分。世界上最大的电脑网络为互联网[3]:1-5。
一句话:设备能够通过节点之间链接传输数据。管你是 wifi、蓝牙、无线还是有线,都叫网络。当然这里只说计算机网络,广义的网络概念大了去了。
什么是网络传输协议?
维基百科说:
通信协议(英语:Communications Protocol,也称传输协议)在电信领域中指的是:在任何物理介质中允许两个或多个在传输系统中的终端之间传播信息的系统标准,也是指计算机通信或网络设备的共同语言。[1]通信协议定义了通信中的语法学、语义学和同步规则以及可能存在的错误检测与纠正。通信协议在硬件、软件或两者之间皆可实现[2]
为了交换大量信息,通信系统使用通用格式(协议)。每条信息都有明确的意义使得预定位置给予响应,并独立实施回应指定的行为,通信协议须参与实体都同意才能生效。[3]为了达成一致,协议必须要有技术标准。编程语言在计算方面也应有相应标准,所以在这个方面可以用编程语言做类比:“编程语言是为了模式化的计算,而传输协议为了更畅通的交流。”[4]
多类别协议构建了单个传输的不同方面,包括同时进行的协议模块,和在软件上实现时的协议栈。
网络传输协议(Internet communication protocol)是互联网工程任务组 (IETF)制定的。电气电子工程师学会(IEEE)负责有线无线传输, 国际标准化组织 (ISO) 负责其他类别。ITU-T 负责电信通讯传输以及公共交换电话网 (PSTN)的格式。 在公共交换电话网与网络技术融合的今天,形势驱使着通信标准进一步的合并收敛。
一句话:设备交换信息时候遵循的协议(条约)。可以理解为大家都讲普通话,那就是协议。(不然一个团队天南地北的讲方言,没法开展工作/传递有效消息)。大家经常买的232转485线就是这个道理。
- 什么是网络?
OSI七层网络模型
OSI(Open System Interconnection “开放式系统互联”)模型将网络通信分为七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
俗称:“物数网传会表应”
官网摘录:
\7. Application Layer
The application layer is used by end-user software such as web browsers and email clients. It provides protocols that allow software to send and receive information and present meaningful data to users. A few examples of application layer protocols are the Hypertext Transfer Protocol (HTTP), File Transfer Protocol (FTP), Post Office Protocol (POP), Simple Mail Transfer Protocol (SMTP), and Domain Name System (DNS).
6. Presentation Layer
The presentation layer prepares data for the application layer. It defines how two devices should encode, encrypt, and compress data so it is received correctly on the other end. The presentation layer takes any data transmitted by the application layer and prepares it for transmission over the session layer.
5. Session Layer
The session layer creates communication channels, called sessions, between devices. It is responsible for opening sessions, ensuring they remain open and functional while data is being transferred, and closing them when communication ends. The session layer can also set checkpoints during a data transfer—if the session is interrupted, devices can resume data transfer from the last checkpoint.
4. Transport Layer
The transport layer takes data transferred in the session layer and breaks it into “segments” on the transmitting end. It is responsible for reassembling the segments on the receiving end, turning it back into data that can be used by the session layer. The transport layer carries out flow control, sending data at a rate that matches the connection speed of the receiving device, and error control, checking if data was received incorrectly and if not, requesting it again.
3. Network Layer
The network layer has two main functions. One is breaking up segments into network packets, and reassembling the packets on the receiving end. The other is routing packets by discovering the best path across a physical network. The network layer uses network addresses (typically Internet Protocol addresses) to route packets to a destination node.
2. Data Link Layer
The data link layer establishes and terminates a connection between two physically-connected nodes on a network. It breaks up packets into frames and sends them from source to destination. This layer is composed of two parts—Logical Link Control (LLC), which identifies network protocols, performs error checking and synchronizes frames, and Media Access Control (MAC) which uses MAC addresses to connect devices and define permissions to transmit and receive data.
\1. Physical Layer
The physical layer is responsible for the physical cable or wireless connection between network nodes. It defines the connector, the electrical cable or wireless technology connecting the devices, and is responsible for transmission of the raw data, which is simply a series of 0s and 1s, while taking care of bit rate control
相关翻译:
\7、应用层
应用层由网络浏览器和电子邮件客户端等最终用户软件使用。它提供允许软件发送和接收信息并向用户呈现有意义数据的协议。应用层协议的几个示例是超文本传输协议(HTTP)、文件传输协议 (FTP)、邮局协议 (POP)、简单邮件传输协议 (SMTP) 和域名系统 (DNS)。
6.表现层
表示层为应用层准备数据。它定义了两个设备应如何编码、加密和压缩数据,以便在另一端正确接收数据。表示层获取应用层传输的任何数据并准备通过会话层传输。
5.会话层
会话层在设备之间创建称为会话的通信通道。它负责打开会话,确保它们在数据传输时保持打开和功能,并在通信结束时关闭它们。会话层还可以在数据传输期间设置检查点——如果会话中断,设备可以从上一个检查点恢复数据传输。
4.传输层
传输层接收在会话层传输的数据,并在发送端将其分成“段”。它负责在接收端重新组装段,将其转回会话层可以使用的数据。传输层执行流量控制,以与接收设备的连接速度相匹配的速率发送数据,以及错误控制,检查数据是否被错误接收,如果没有,则再次请求。
3. 网络层
网络层有两个主要功能。一种是将网段分解为网络数据包,然后在接收端重新组装这些数据包。另一种是通过发现跨物理网络的最佳路径来路由数据包。网络层使用网络地址(通常是 Internet 协议地址)将数据包路由到目标节点。
2.数据链路层
数据链路层建立和终止网络上两个物理连接的节点之间的连接。它将数据包分解为帧并将它们从源发送到目的地。该层由两部分组成——逻辑链路控制 (LLC) 和媒体访问控制 (MAC),前者识别网络协议、执行错误检查和同步帧,后者使用 MAC 地址连接设备并定义传输和接收数据的权限。
\1. 物理层
物理层负责网络节点之间的物理电缆或无线连接。它定义了连接设备的连接器、电缆或无线技术,并负责传输原始数据,即一系列 0 和 1,同时负责比特率控制。
特性:
1.俩台设备在不同层不能通信。
2.数据传输不能跃层
3.俩台设备遵循的协议要完全相同。(上述解释过)。
五层网络模型
就是将OSI模型中的 会话层、表示层、应用层三层统称应用层,一部分人的说法,大多数情况下都认为是四层网络模型/七层网络模型。不过不算错,跟四层网络模型差不多,就留着四层网络模型里面说。
四层网络模型
五层网络模型是OSI七层合并会话层、表示层、应用层,那么四层呢,当然不止将OSI模型中的 会话层、表示层、应用层三层统称应用层,还要把物理层和数据链路层合并起来统称 链路层。
就变成了:链路层、网络层、传输层、应用层。
好了,又要蒙了,一堆理论,什么玩意?
简单的说:ISO七层时候有很多是它定义标准时候抽象出来的层级,我们现在找不到对应的一个东西说它是属于会话层/表示层。五层模型的认为这两层就是多的,使用中是不需要考虑的。但是标准就是标准,也要明白,就像我们技术研究不出来光速的东西,但是光速的标准依然存在。
刚刚说到,ISO有两层是找不到相应的东西的,那剩下的呢?当然可以
层名 | 对应 |
---|---|
物理层 | 网线、wifi、蓝牙等 |
数据链路层 | mac地址等 |
网络层 | ip等 |
传输层 | tcp、udp等 |
应用层 | 超文本传输协议(HTTP)、文件传输协议 (FTP)、邮局协议 (POP)、简单邮件传输协议 (SMTP) 和域名系统 (DNS) |
好的,那么四层网络模型就是不去关注物理层,就关注数据传输的层面。
那么相关应用呢,物理层大家比较常见网线呗,数据链路层:交换机,网络层:路由器,传输层:tcp协议应用,lvs做四层负载均衡,应用层:http/https我们经常访问的网页都是。
这下一下说通了哈。
TCP/IP协议
其实就是四层网络协议,那为啥不是udp/ip协议呢?不是还有UDP吗?这就是学死了,它表示整个四层模型协议,不光指的tcp–>ip这一种,同样udp–>ip传输构建的四层网络也是属于要遵循TCP/IP协议。
那么他们之间数据是怎么传输的呢?
下面列举一个场景说明一下:
我的服务器已经知道了http://www.baidu.com:80这个网址,我作为一台客户端,通讯过程是啥样的呢?(这里暂时不考虑DNS域名解析问题,防止跑题,也暂时不说三次握手四次挥手,简单一次访问)
我的服务器使用curl www.baidu.com
那么我的服务器就要从应用层出发,因为curl
对应htttp/https请求属于应用层,那么机器就收到指令,发送一次请求给百度服务器,我们也说了不能跳跃层级,想从我的服务器出去,就要发生:
1.应用层打包http协议包(状态:http协议包)传入下一层
2.传输层该问了,你来自哪个端口,要去哪个端口?tcp or udp,sir? 这个协议包又打包一层,这里就走最常见的tcp,就加上了tcp头。(状态:(tcp头(http协议包)))传入下一层
3.网络层该问,你来自哪个IP,又要去哪个IP?这个协议包又又打包一层。(状态:(IP头(tcp头(http协议包))))传入下一层
4,链路层该问了,你的mac地址是啥,你要去哪个mac地址?这个协议包又又又打包一层。(状态:(链路头(IP头(tcp头(http协议包))))),并发出。
百度服务器收到:
1,链路层该问了,你是来这的吗?告诉我你从哪个mac哪里来?(因为不对应要拒绝的)。确认允许,这个协议包脱一层(状态:(IP头(tcp头(http协议包))))传入上一层
2,网络层该问了,你是来这的吗?告诉我你从哪个IP哪里来?(因为不对应要拒绝的)。确认允许,这个协议包脱一层(状态:(tcp头(http协议包)))传入上一层
3,传输层该问了,你是来这的吗?告诉我你从哪个端口哪里来?(因为不对应要拒绝的)。确认允许,这个协议包脱一层(状态:http协议包)传入上一层
4,应用层解包http协议包(状态:数据)
你可以感受到它的繁琐,但是它是相对安全的(只要上网没有绝对安全啊)。比如,我们常用的iptables可以封路由,封ip,封端口,保证你的服务的安全。当然他也是很快速的,正常访问百度不会超过一秒。其实在这一秒中它做了更多的事,包括一会讲的三次握手、四次挥手。
TCP、UDP是啥?
维基百科这么描写TCP的:
传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。
在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来透过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认信息(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失并进行重传。TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和。
维基百科这么描写UDP的:
用户数据报协议(英语:User Datagram Protocol,缩写:UDP;又称用户数据包协议)是一个简单的面向数据包的通信协议,位于OSI模型的传输层。该协议由David P. Reed在1980年设计且在RFC 768中被规范。典型网络上的众多使用UDP协议的关键应用在一定程度上是相似的。
在TCP/IP模型中,UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据包协议)。UDP在IP数据包的头部仅仅加入了复用和数据校验字段。
UDP适用于不需要或在程序中执行错误检查和纠正的应用,它避免了协议栈中此类处理的开销。对时间有较高要求的应用程序通常使用UDP,因为丢弃数据包比等待或重传导致延迟更可取。
一句话:tcp更加安全,可靠,但是一些 场景下不安全的udp传输也是被允许的,因为传输速度快。而他们都是在传输层的协议类型。
三次握手/四次挥手
三次握手和四次挥手是指网络建立连接过程和断开连接过程
三次握手
1,发送端首先发送一个带有SYN(synchronize)标志地数据包给接收方。
2,接收方接收后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。
3,最后,发送方再回传一个带有ACK标志的数据包,代表我知道了,表示’握手‘结束。
四次挥手
1,第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送。
2,第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1
3,第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送.
4,第四次挥手:Client收到FIN后,接着发送一个ACK给Server,确认序号为收到序号+1.
上面理论是不是看着蒙的。稍等,我们一会去抓包感受一下就好了。有图有真相。
tcpdump抓包应用
tcpdump命令 是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息。是一个覆盖网络协议全层次的抓包工具。
来我们先安装:
yum -y install tcpdump #centos7
apt-get -y install tcpdump #ubuntu
#其他系统自行百度
了解一下参数:
-a:尝试将网络和广播地址转换成名称;
-c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作;
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;
-e:在每列倾倒资料上显示连接层级的文件头;
-f:用数字显示网际网络地址;
-F<表达文件>:指定内含表达方式的文件;
-i<网络界面>:使用指定的网络截面送出数据包;
-l:使用标准输出列的缓冲区;
-n:不把主机的网络地址转换成名字;
-N:不列出域名;
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q :快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件读取数据包数据;
-s<数据包大小>:设置每个数据包的大小;
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间戳记;
-tt: 在每列倾倒资料上显示未经格式化的时间戳记;
-T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型;
-v:详细显示指令执行过程;
-vv:更详细显示指令执行过程;
-x:用十六进制字码列出数据包资料;
-w<数据包文件>:把数据包数据写入指定的文件。
我们只用到相关的几个。 -v -vv -n -nn -a -w 。
还要用到一个命令配合,刚刚说的curl
这里就不列出参数了,就直接用一下指令就好:
curl https://www.bilibili.com/ -s -o /dev/null #访问一次bilibili官网 -s 不输出错误信息 -o将获取的信息保存 、dev/null垃圾回收站,连起来就是,访问一次,不讲结果,不显示
或者
while true; do curl -s -o /dev/null https://www.bilibili.com/; sleep 200 ; done #循环访问 间隔200s,可以改间隔时间
一步步来看:
1,我在服务器上下载好tcpdump。
2,开启两个窗口(同一个服务器哦)
3,窗口一执行tcpdump -i eth0 host www.bilibili.com
等待信息了,来在窗口二访问一下www.bilibili.com试试。
平平无奇,来看看窗口一发生什么了吧。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:36:44.166029 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [S], seq 1539413850, win 29200, options [mss 1460,sackOK,TS val 2164214107 ecr 0,nop,wscale 7], length 0
16:36:44.191061 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [S.], seq 2265064178, ack 1539413851, win 42340, options [mss 1460,nop,wscale 9], length 0
16:36:44.191076 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 1, win 229, length 0
16:36:44.263988 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [P.], seq 1:203, ack 1, win 229, length 202
16:36:44.288482 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [P.], seq 1461:2921, ack 203, win 83, length 1460
16:36:44.288503 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 1, win 229, length 0
16:36:44.288975 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [.], ack 203, win 83, length 0
16:36:44.290054 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [.], seq 1:1461, ack 203, win 83, length 1460
16:36:44.290060 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 2921, win 251, length 0
16:36:44.290113 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [P.], seq 2921:4316, ack 203, win 83, length 1395
16:36:44.290118 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 4316, win 274, length 0
16:36:44.294670 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [P.], seq 203:329, ack 4316, win 274, length 126
16:36:44.318082 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [.], ack 329, win 83, length 0
16:36:44.318215 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [P.], seq 4316:4367, ack 329, win 83, length 51
16:36:44.318367 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [P.], seq 329:438, ack 4367, win 274, length 109
16:36:44.341771 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [.], ack 438, win 83, length 0
16:36:44.857927 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [.], seq 4367:5827, ack 438, win 83, length 1460
16:36:44.857981 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [P.], seq 8747:9959, ack 438, win 83, length 1212
16:36:44.857990 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 5827, win 297, length 0
16:36:44.857983 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [.], seq 7287:8747, ack 438, win 83, length 1460
16:36:44.857995 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 5827, win 297, length 0
16:36:44.859498 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [P.], seq 5827:7287, ack 438, win 83, length 1460
16:36:44.859505 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 9959, win 320, length 0
16:36:44.859809 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [P.], seq 438:469, ack 9959, win 320, length 31
16:36:44.859819 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [F.], seq 469, ack 9959, win 320, length 0
16:36:44.883224 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [.], ack 469, win 83, length 0
16:36:44.884811 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [F.], seq 9959, ack 470, win 83, length 0
16:36:44.884818 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 9960, win 320, length 0
是不是感觉好多,那简单,看下第一条:
第一列为第一项以此排序
16:36:44.166029 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [S], seq 1539413850, win 29200, options [mss 1460,sackOK,TS val 2164214107 ecr 0,nop,wscale 7], length 0
第一项是时间不用说,第二项是啥,好像不知道耶,无所谓,我们看第三项 IP,看到了什么?
刚刚说的位于数据网络层的东西,那不用想就是IP头了,看后面是啥?
bcchost.bj.baidu.internal.43012 > 61.147.236.46
本机的hostname 端口 43012 去发送到 bilibili的IP 端口https。但是我们知道https就是443。
flags【S】是啥啊,先不管后面有工具帮你,(其实就是三次握手中第一次SYN信号)。
seq的value是1539413850。后面是啥不管它。
是不是很简单,那再看两条
16:36:44.166029 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [S], seq 1539413850, win 29200, options [mss 1460,sackOK,TS val 2164214107 ecr 0,nop,wscale 7], length 0 #刚刚第一条
16:36:44.191061 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [S.], seq 2265064178, ack 1539413851, win 42340, options [mss 1460,nop,wscale 9], length 0
16:36:44.191076 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 1, win 229, length 0
由刚刚分析可以知道 第二、第三条是:
bilibili的IP加端口回复了刚刚的包,给我服务器的43012端口,Flags 是[S.](就是三次握手中SYN\ACK状态),seq的value是2265064178 ,ack值是1539413851(刚刚seq的值+1)
我服务器的43012端口发送 bilibili的IP加端口包, Flags [.](就是第三次握手中的ack)。
同理看后四条:
16:36:44.859819 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [F.], seq 469, ack 9959, win 320, length 0
16:36:44.883224 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [.], ack 469, win 83, length 0
16:36:44.884811 IP 61.147.236.46.https > bcchost.bj.baidu.internal.43012: Flags [F.], seq 9959, ack 470, win 83, length 0
16:36:44.884818 IP bcchost.bj.baidu.internal.43012 > 61.147.236.46.https: Flags [.], ack 9960, win 320, length 0
解释:
我服务器的43012端口发送 bilibili的IP加端口数据包,Flags 是 [F.](第一次挥手时候FIN/ACK状态),seq=469 ack=9959
bilibili的IP加端口发送我服务器的43012端口数据包,Flags 是 [.] (第二次挥手时候ack状态 ),
ack=469
bilibili的IP加端口发送我服务器的43012端口数据包,Flags 是 [F.](第三次挥手时候FIN/ACK状态),
seq=9959 ack=470
我服务器的43012端口发送 bilibili的IP加端口数据包,Flags 是 [.] (第四次挥手时候ack状态 ),
ack=9960
是不是一下就明朗了。有兴趣还可以试试以下命令抓取跟现在有和不同:
tcpdump -i eth0 -v host www.bilibili.com
tcpdump -i eth0 -vv host www.bilibili.com
tcpdump -i eth0 -n host www.bilibili.com
tcpdump -i eth0 -nn host www.bilibili.com
tcpdump -i eth0 -vv -nn host www.bilibili.com
tcpdump -i eth0 -a -vv -nn host www.bilibili.com
#抓包结束可以使用curl+C的方式停止抓取,每次抓取指令执行后记得在另外窗口执行 curl https://www.bilibili.com/ -s -o /dev/null 命令
我就再实验一个 tcpdump -i eth0 -a -vv -nn host www.bilibili.com
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:08:05.767358 IP (tos 0x0, ttl 64, id 46423, offset 0, flags [DF], proto TCP (6), length 60)
192.168.48.4.38344 > 61.147.236.42.443: Flags [S], cksum 0x59a0 (correct), seq 4292692490, win 29200, options [mss 1460,sackOK,TS val 2166095709 ecr 0,nop,wscale 7], length 0
17:08:05.792656 IP (tos 0x0, ttl 48, id 0, offset 0, flags [DF], proto TCP (6), length 48)
61.147.236.42.443 > 192.168.48.4.38344: Flags [S.], cksum 0xdcf5 (correct), seq 3044167778, ack 4292692491, win 42340, options [mss 1460,nop,wscale 9], length 0
17:08:05.792671 IP (tos 0x0, ttl 64, id 46424, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0xad42 (correct), seq 1, ack 1, win 229, length 0
17:08:05.872484 IP (tos 0x0, ttl 64, id 46425, offset 0, flags [DF], proto TCP (6), length 242)
192.168.48.4.38344 > 61.147.236.42.443: Flags [P.], cksum 0x21f3 (correct), seq 1:203, ack 1, win 229, length 202
17:08:05.897811 IP (tos 0x0, ttl 48, id 46041, offset 0, flags [DF], proto TCP (6), length 40)
61.147.236.42.443 > 192.168.48.4.38344: Flags [.], cksum 0xad0a (correct), seq 1, ack 203, win 83, length 0
17:08:05.898663 IP (tos 0x0, ttl 48, id 46043, offset 0, flags [DF], proto TCP (6), length 1500)
61.147.236.42.443 > 192.168.48.4.38344: Flags [P.], cksum 0x7b68 (correct), seq 1461:2921, ack 203, win 83, length 1460
17:08:05.898673 IP (tos 0x0, ttl 64, id 46426, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0xac78 (correct), seq 203, ack 1, win 229, length 0
17:08:05.898721 IP (tos 0x0, ttl 48, id 46044, offset 0, flags [DF], proto TCP (6), length 1435)
61.147.236.42.443 > 192.168.48.4.38344: Flags [P.], cksum 0xd50c (correct), seq 2921:4316, ack 203, win 83, length 1395
17:08:05.898727 IP (tos 0x0, ttl 64, id 46427, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0xac78 (correct), seq 203, ack 1, win 229, length 0
17:08:05.899257 IP (tos 0x0, ttl 47, id 46042, offset 0, flags [DF], proto TCP (6), length 1500)
61.147.236.42.443 > 192.168.48.4.38344: Flags [.], cksum 0x5c8b (correct), seq 1:1461, ack 203, win 83, length 1460
17:08:05.899265 IP (tos 0x0, ttl 64, id 46428, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0x9b87 (correct), seq 203, ack 4316, win 251, length 0
17:08:05.903902 IP (tos 0x0, ttl 64, id 46429, offset 0, flags [DF], proto TCP (6), length 166)
192.168.48.4.38344 > 61.147.236.42.443: Flags [P.], cksum 0x2a6b (correct), seq 203:329, ack 4316, win 251, length 126
17:08:05.929190 IP (tos 0x0, ttl 48, id 46045, offset 0, flags [DF], proto TCP (6), length 40)
61.147.236.42.443 > 192.168.48.4.38344: Flags [.], cksum 0x9bb1 (correct), seq 4316, ack 329, win 83, length 0
17:08:05.929405 IP (tos 0x0, ttl 48, id 46046, offset 0, flags [DF], proto TCP (6), length 91)
61.147.236.42.443 > 192.168.48.4.38344: Flags [P.], cksum 0xdeef (correct), seq 4316:4367, ack 329, win 83, length 51
17:08:05.929575 IP (tos 0x0, ttl 64, id 46430, offset 0, flags [DF], proto TCP (6), length 149)
192.168.48.4.38344 > 61.147.236.42.443: Flags [P.], cksum 0xe416 (correct), seq 329:438, ack 4367, win 251, length 109
17:08:05.954869 IP (tos 0x0, ttl 48, id 46047, offset 0, flags [DF], proto TCP (6), length 40)
61.147.236.42.443 > 192.168.48.4.38344: Flags [.], cksum 0x9b11 (correct), seq 4367, ack 438, win 83, length 0
17:08:06.469042 IP (tos 0x0, ttl 48, id 46050, offset 0, flags [DF], proto TCP (6), length 1500)
61.147.236.42.443 > 192.168.48.4.38344: Flags [.], cksum 0x0954 (correct), seq 7287:8747, ack 438, win 83, length 1460
17:08:06.469057 IP (tos 0x0, ttl 64, id 46431, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0x9a69 (correct), seq 438, ack 4367, win 251, length 0
17:08:06.469625 IP (tos 0x0, ttl 47, id 46048, offset 0, flags [DF], proto TCP (6), length 1500)
61.147.236.42.443 > 192.168.48.4.38344: Flags [.], cksum 0xd7ee (correct), seq 4367:5827, ack 438, win 83, length 1460
17:08:06.469635 IP (tos 0x0, ttl 64, id 46432, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0x949e (correct), seq 438, ack 5827, win 274, length 0
17:08:06.469684 IP (tos 0x0, ttl 47, id 46049, offset 0, flags [DF], proto TCP (6), length 1500)
61.147.236.42.443 > 192.168.48.4.38344: Flags [P.], cksum 0xba78 (correct), seq 5827:7287, ack 438, win 83, length 1460
17:08:06.469691 IP (tos 0x0, ttl 64, id 46433, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0x891f (correct), seq 438, ack 8747, win 297, length 0
17:08:06.469685 IP (tos 0x0, ttl 47, id 46051, offset 0, flags [DF], proto TCP (6), length 1258)
61.147.236.42.443 > 192.168.48.4.38344: Flags [P.], cksum 0xfb86 (correct), seq 8747:9965, ack 438, win 83, length 1218
17:08:06.469697 IP (tos 0x0, ttl 64, id 46434, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0x8446 (correct), seq 438, ack 9965, win 320, length 0
17:08:06.470011 IP (tos 0x0, ttl 64, id 46435, offset 0, flags [DF], proto TCP (6), length 71)
192.168.48.4.38344 > 61.147.236.42.443: Flags [P.], cksum 0xbacb (correct), seq 438:469, ack 9965, win 320, length 31
17:08:06.470024 IP (tos 0x0, ttl 64, id 46436, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [F.], cksum 0x8426 (correct), seq 469, ack 9965, win 320, length 0
17:08:06.495309 IP (tos 0x0, ttl 48, id 46052, offset 0, flags [DF], proto TCP (6), length 40)
61.147.236.42.443 > 192.168.48.4.38344: Flags [.], cksum 0x8514 (correct), seq 9965, ack 469, win 83, length 0
17:08:06.495366 IP (tos 0x0, ttl 48, id 46053, offset 0, flags [DF], proto TCP (6), length 40)
61.147.236.42.443 > 192.168.48.4.38344: Flags [F.], cksum 0x8512 (correct), seq 9965, ack 470, win 83, length 0
17:08:06.495374 IP (tos 0x0, ttl 64, id 46437, offset 0, flags [DF], proto TCP (6), length 40)
192.168.48.4.38344 > 61.147.236.42.443: Flags [.], cksum 0x8425 (correct), seq 470, ack 9966, win 320, length 0
发现进行了相应的显示转换,而且我本机调用端口都不一样了(端口随机)。但是我们三次握手四次挥手过程没有改变。
Wireshark 应用
这个要自己下载,百度下载安装一堆,这就不说了。
我们这里利用tcpdump -i eth0 -nn host www.bilibili.com -w bili.cap
指令进行一次抓取。并且把抓取结果导入Wireshark 。(这里一定要保存为.cap
文件)
可以看出明显的三次握手和四次挥手过程。