web前端网络知识体系梳理之三:详解 “三次握手和四次挥手”

web前端网络知识体系梳理之三:详解 “三次握手和四次挥手”_第1张图片

写在前面:

(1)写作目的

本篇文章作为一项长期的写作计划进行,主要用于将笔者学习到的零散的web网络知识进行梳理和整合。

(2)知识来源

  • 图解TCP/TP
  • 图解HTTP
  • 优秀的web前端网络文章

你将会了解到:

一、TCP 三次握手和四次挥手

web前端网络知识体系梳理之三:详解 “三次握手和四次挥手”_第2张图片

1、什么是三次握手和四次挥手
  • TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。
  • TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。
  • TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。
2、三次握手

(1)注意点:

  • 按层次分,TCP 位于传输层,提供可靠的字节流服务

字节流服务:(Byte Stream Service)是指,为了方便传输,将大 块数据分割成以报文段(segment)为单位的数据包进行管理。
可靠的传输服务:能够把数据准确可靠地传给对方。

  • 为了准确无误地将数据送达目标处,TCP 协议采用了三次握手 (three-way handshaking)策略。

(2)三次握手的流程:

web前端网络知识体系梳理之三:详解 “三次握手和四次挥手”_第3张图片

  1. 客户端发送一个 SYN 段,并指明客户端的初始序列号,即 ISN©.
  2. 服务端发送自己的 SYN 段作为应答,同样指明自己的 ISN(s)。为了确认客户端的SYN,将 ISN©+1 作为 ACK 数值。这样,每发送一个 SYN,序列号就会加1. 如果有丢失的情况,则会重传。
  3. 为了确认服务器端的SYN,客户端将ISN(s)+1作为返回的ACK数值。

以下是java代码连接数据库的三次握手过程

在这里插入图片描述

握手的核心目的:告知对方seq(绿框是client的初始seq,蓝色框是server 的初始seq),对方回复ack(收到的seq+包的大小),这样发送端就知道有没有丢包了。

握手的次要目的:告知和协商一些信息,图中黄框。

  • MSS–最大传输包
  • SACK_PERM–是否支持Selective ack(用户优化重传效率)
  • WS–窗口计算指数

(3)概念名词解析:

  1. TCP报文到达确认(ACK)机制

TCP数据包中的序列号(Sequence Number)


编号原理:将连接生存周期内传输的所有数据当作一个字节流,序列号就是整个字节 流中每个字节的编号。

注意点:

  • 一个TCP数据包中包含多个字节流的数据(即数据段)
  • 每个TCP数据包中的数据大小不一定相同
  • 在建立TCP连接的三次握手
    过程中,通信双方各自已确定了初始的序号x和y,TCP每次传送的报文段中的序号字段值表示所要传送本报文中的第一个字节的序号

TCP的报文到达确认(ACK)


功能: 对接收到的数据的最高序列号的确认,并向发送端返回一个下次接收时期望的TCP数据包的序列号(Ack Number)。例如, 主机A发送的当前数据序号是400,数据长度是100,则接收端收到后会返回一个确认号是501的确认号给主机A。

3、四次挥手

(1)流程:
web前端网络知识体系梳理之三:详解 “三次握手和四次挥手”_第4张图片

  1. 客户端发送一个 FIN 段,并包含一个希望接收者看到的自己当前的序列号 K. 同时还包含一个 ACK表示确认对方最近一次发过来的数据。
  2. 服务端将 K 值加1作为 ACK 序号值,表明收到了上一个包。这时上层的应用程序会被告知另一端发起了关闭操作,通常这将引起应用程序发起自己的关闭操作。
  3. 服务端发起自己的FIN段,ACK=K+1, Seq=L
  4. 客户端确认。ACK = L+1

(2)概念名词解析:

TCP 中的 FLAGS 字段


  • SYN 表示建立连接
  • FIN 表示关闭连接
  • ACK 表示响应
  • PSH 表示有 DATA数据传输
  • RST 表示连接重置
4、问题

(1)为什么要进行三次握手?

  • 第一次握手: 客户端向着服务端发包,服务端成功接收,服务端就能确认:服务端的接受能力和客户端的发送能力都没有问题。
  • 第二次握手: 服务端向客户端发包,客户端成功接收,客户端就可以确认:客户端的发送和接收能力、服务端的发送和接收能力都是没有问题的。
  • 第三次握手: 客户端发包,结束通信,服务端成功收到,服务端就可以确认:服务端的接收能力和发送能力;客户端的接收能力和发送能力都没有问题。

至此,双方确认了自己的接收、发送能力是正常的。之后就可以正常通信了。

(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送。

(3)如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

推荐阅读:

TCP报文到达确认(ACK)机制
就是要你懂 TCP
HCNP学习笔记之TCP中FLAGS字段SYN, FIN, ACK, PSH, RST, URG
web前端网络知识体系梳理之二:客户端渲染全流程以及常见性能优化
web前端网络知识体系梳理之一:DNS 域名解析和 https 的局限性

感谢阅读,欢迎批评指正,如果觉得还可以的话,麻烦点赞关注,谢谢啦!希望大家能够在追求卓越中不断进步,让优秀成为一种习惯~

你可能感兴趣的:(web,js,网络)