这里先介绍2个概念:

TCB:Transmission Control Block,传输控制块,这个和PCB(进程控制块)类似,存储了很多重要的内容。如TCP连接表,发送缓存指针和接收缓存指针,重发队列指针,当前序列号和确认序列号(ACK)。

ACK包中带有“数据”,这个数据是指处理SYN(Synchronize Sequence Numbers同步序列号),确认包序列为seq=x+1,这个x是客户端或服务器传过来的。但在实际TCP3次握手中,不仅仅包含这些东西,还带有商议的内容如MSS(maximum segment size)等。

假设客户端和服务端目前都处于CLOSED状态。

流程图如下:

1. 服务端创建TCB,并且使用TCB接收客户端请求,当TCB建立起来后,服务端的状态会从CLOSED变为LISTEN。

2. 客户端也创建TCB,并且使用TCB发送请求,请求头中带有“SYN=1”,生成一个任意的随机数seq=x。SYN包(SYN设置为1的包称为SYN包),除了携带sql=x这个会被服务端处理的消息,不会携带其他消息。当请求发送后客户端会从CLOSED状态转变为SYN-SENT状态。

3. 服务端接收到客户端消息后:

a. 如果服务端接收到客户端发起的连接(也就是这个消息),会回一个确认消息,在消息体中带有SYN和ACK,并且都会被置为1,服务端也会生成一个随机数seq=y,ack=x+1,这个x是客户端发过来的值,这个包里面只会包含刚刚说的那些数据。此时服务端的状态将变为SYN-RCVD。

b. 如果服务端拒绝连接,将会发送RST包用于重置连接。

4. 客户端接收到服务端的响应,会发送一个确认包内容为ACK置为1,seq=x+1。

完成上面的操作后两个进程的状态都会转变为ESTABLISHED,这就是TCP的三次握手。

官方的例子如下:

点击下载

下面来分析下本人抓的包:

这里我们使用Java搭建一个Web服务端,请求的关键代码如下:

package cn.it1995.demo;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@GetMapping("/test")public String test(){return "test";}
}

用C++写个客户端,让其连接,获取数据,然后断开连接:

#include <QCoreApplication>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QNetworkAccessManager manager;QNetworkRequest request;request.setUrl(QUrl("http://127.0.0.1:8080/test"));QNetworkReply *reply = manager.get(request);QObject::connect(reply, &QNetworkReply::finished, [&](){qDebug() << reply->readAll();qApp->exit();});return a.exec();
}

此时抓到的包如下:

一开始客户端发了一个包将Seq=0。

服务端收到后返回Ack=0+1,而Seq=0这个0为服务端产生的随机数。

客户端接收到服务端的包后将Ack设置为1,Seq为0+1。这个0为服务端传过来的0。

Wireshark文档阅读笔记-TCP 3 way handshaking解析与实例相关推荐

  1. Wireshark文档阅读笔记-TCP 4 times close解析与实例

    先介绍一个知识点: 当TCP最后一次握手结束后,也就是客户端发送ACK后,客户端不会立即释放资源.会先将状态转换为TIME-WAIT然后等到2-MSL(Maximum Segment Lifetime ...

  2. Qt文档阅读笔记-QML Canvas的官方解析及实例

    目录 官方解析 博主例子 官方解析 Canvas可以用于画直线或曲线,简单或复杂的形状,图形,图片,并且他能加文字,颜色,阴影,和颜色梯度,和其他的装饰,可以进行低像素操作.Canvas可以保存成图像 ...

  3. Qt文档阅读笔记-FileDialog QML Type官方解析与实例

    目录 官方解析 博主例子 官方解析 FileDialog是基于文件的选择器,可以选择文件或文件夹,创建文件,这个Dialog初始化是不可见的,得需要设置他为visible或调用open()即可. 下面 ...

  4. Qt文档阅读笔记-TextEdit QML Type官方解析及实例

    目录 官方解析 博主栗子 官方解析 TextEdit展示了一个可编辑的一块,是有格式的文本. 他同样能展示普通文本和富文本: TextEdit {width: 240text: "<b ...

  5. Qt文档阅读笔记-Text QML Type官方解析及实例

    目录 官方解析 博主例子 官方解析 Text能够展示纯文本和富文本.举个例子,红色文本以及指定的字体和大小 Text {text: "Hello World!"font.famil ...

  6. Qt文档阅读笔记-Label QML Type官方解析及实例

    目录 官方解析 博主例子 官方解析 Label扩展了父类Text中的styling和font.Label同样是有可视化的background项. Label {text: "Label&qu ...

  7. Qt文档阅读笔记-Button QML Type官方解析及实例

    目录 官方解析 博主栗子 官方解析 按钮展示了一个按钮控件,这个控件可以被用户所按下,按钮是通常被用于执行一个操作,或者解决一个问题.buttons有如下几个典栗,如Ok,Apply,Cancel,C ...

  8. Qt文档阅读笔记-Timer QML Type 官方解析与实例

    目录 官方解析 博主例子 官方解析 Timer能够触发一个动作,或者在给定时间重复这个动作: 下面给出显示当前时间的代码,500毫秒刷新异常,这里是通过JS对象来获取当前时间! import QtQu ...

  9. Wireshark文档阅读笔记-WebSocket协议基本概念

    WebSocket WebSocket是基于TCP的全双工协议.WebSocket是2011年IETF RFC6455中定义的标准,他的API是W3C定义的. WebSocket不仅适用于浏览器.服务 ...

最新文章

  1. Oracle逻辑结构学习笔记
  2. 35岁之后程序员的认可度不是很高
  3. mysql check table_修复MySQL的MyISAM表命令check table用法
  4. LeetCode 1119. 删去字符串中的元音
  5. RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
  6. 从skyeye学习arm(文件系统篇)
  7. 797. 差分(有图解)
  8. Docker Compose 笔记
  9. Ubuntu彻底卸载MySQL
  10. boss直聘一句话介绍优势_第一批被安永淘汰的00后实习生,就因为自我介绍说了这一句话!...
  11. 怎么在服务器上接无线路由器,交换机怎么用 交换机接无线路由器设置教程【详解】...
  12. BOOST的JSON解析库Boost.JSON简介
  13. 8本好书上新:越忙越要多读书 1
  14. python:兔子繁殖问题
  15. 2岁宝宝吃饭问题网络调研
  16. 12星座谈恋爱:说分手,很容易
  17. IOT-Studio 物联网应用开发实例
  18. 对接阿里云短信服务(附视频教程)
  19. 一、在PyCharm上直接调试py脚本
  20. 从车联网基础知识出发通往5G彼岸

热门文章

  1. Nuclide 早起用户体感
  2. loadrunner 参数化
  3. ASP.NET MVC5使用AjaxHelp
  4. JVM并发机制探讨—内存模型、内存可见性和指令重排序
  5. HTTP header location 重定向 URL
  6. 云计算时代下的数据中心运维之路
  7. API – MultiByteToWideChar的用法
  8. 飞鸽传书2012发展触摸屏技术发展迅猛
  9. 飞鸽传书2012是否发布了?
  10. 总结一下这一年来的心得体会