TCP三次握手 TCP 报文: 分首部 和 数据 两个部分 首部 默认是 20 字节长度.也就是 160bits 1字节(Byte)=8 bits

【源端口】- 16bit 来源处的端口号;

【目的端口】- 16bit 目的处的端口号;

【序号】- 32bit 每一个TCP报文段都会有一个序号,序号字段的值其实是本报文段所发送的数据的第一个字节的序号。这是因为TCP是面向连接的可靠服务,其每一个字节都会对应一个序号,通过序号来确保服务的可靠性和有序性。

【确认号】- 32bit 确认号,是期望收到对方的下一个报文段的数据的第一个字节的序号。(这句话有些拗口,但是在后面我们讲解三次握手和四次挥手时,大家会更深刻的理解这句话的含义)

【数据偏移】- 4bit 其实它本质上就是“首部长度”,因为“数据偏移”是指TCP报文段的数据部分的起始处距离TCP报文段的起始处的距离。(仍然很拗口,但相信你能明白)。 数据偏移总共占4bit,因此最大能表示的数值为15。而数据偏移的单位是“4字节”,此处的设计和IP数据报的设计是完全相同的,所以说TCP报文段首部的长度最长为15×4=60字节,且首部长度必须为4字节的整数倍。

【保留字段】- 6bit 这6bit在标准中是保留字段,我猜测,有两个目的,第一个是预留除URG/ACK/PSH/RST/SYN/FIN/之外的冗余功能位;第二个是为了对其字节位。

【紧急字段URG】- 1bit 此字段告诉系统此报文段中有紧急数据,应尽快传送。当URG=1时,

【确认字段ACK】- 1bit 当ACK=1时,表示确认,且确认号有效;当ACK=0时,确认号字段无效。

【推送字段PSH】- 1bit 当PSH=1时,则报文段会被尽快地交付给目的方,不会对这样的报文段使用缓存策略。

【复位字段RST】- 1bit 当RST为1时,表明TCP连接中出现了严重的差错,必须释放连接,然后再重新建立连接。

【同步字段SYN】- 1bit 当SYN=1时,表示发起一个连接请求。

【终止字段FIN】- 1bit 用来释放连接。当FIN=1时,表明此报文段的发送端的数据已发送完成,并要求释放连接。

【窗口字段】- 16bit 此字段用来控制对方发送的数据量,单位为字节。 一般TCP连接的其中一端会根据自身的缓存空间大小来确定自己的接收窗口大小,然后告知另一端以确定另一端的发送窗口大小。

【校验和字段】- 16bit 这个校验和是针对首部和数据两部分的。

【紧急指针字段】- 16bit 紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。

三次握手 : Three-way handshake 一个虚拟的链接的建立 是通过三次握手 来实现的 SYN: synchronous 是TCP/IP建立连接时使用的握手信号。 ACK: 确认标志 SYN/ACK 包: 确认包 仅仅是 SYN 和 ACK 标记为1 的 TCP 包

客户端 要和 服务器 通讯:

第一次握手: 客户端 发一个 SYN=1 ACK=0 的TCP包 表示: 请求进行连接. 只是请求/试探/询问是否可以连接服务器,服务器同意连的话 还是要客户端再确认一次(也就是第三次握手)才正式连接.

第二次握手: 服务器收到请求并允许进行连接的话
发一个 SYN=1 ACK=1 的 TCP 包给客户端
表示: 可以连接了 并 要求客户端返回一个确认数据包 确认进行连接 (有可能 客户端只是问问能不能链接)

第三次握手: 客户端 发一个SYN=0,ACK=1的数据包给服务器,告诉服务器我确实要建立连接 而不是耍你… 正式连接成功

连接成功以后: TCP 的每个包 都会设置 ACK 位 这就是连接跟踪 很重要的原因了
没有跟踪的话防火墙无法判断 收到的 ACK 包是不是属于一个已经建立的链接.

在客户机和服务器之间建立正常的TCP网络连接时, 首先 客户端发出一个包含SYN标志的数据包 然后 服务器 返回 SYN+ACK的应答包 表示接收到了这个消息, 最后 客户机再返回一个ACK确认包响应。 这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。 当服务器发送应答包后 没收到确认包 服务器就会进入等待直到超时 等待期间 这些半链接的客户端都保存在一个有限的缓存列表中 如果有大量的 syn 包发给服务器 而且又不回应服务器的话 会造成 tcp 资源迅速耗尽 直到服务器系统崩溃

客户端 服务端 客户端发送 syn 报文 并发送序号为 x syn=1 seq=x

服务器发送 syn+ack 报文 发送序号为 y 确认序号 x+1

客户端发送 ack 报文 发送序号为 z 确认序号 y+1

wireshark TCP 握手 实测: 显示过滤里 设置 tcp.stream eq 5
然后打开一个网站 wireshark 里就能 看到3个 数据了 这就是三次握手包