1.http/1.1
tcp三次握手(syn,syn ack ,ack)建立TCP连接。
1个网页一般由多个文件组成,最基本的就是html、css、js和图片文件。对于http协议来说,我们打开1个网页需要TCP三次握手,建立TCP连接,才正式进行请求。服务器先发送html文件给我们,其他文件不会发给我吗。我们浏览器在收到html文件以后,根据html里面的内容再向服务器一次请求Css、Js等文件。如果请求队伍里面有一个文件没有收到,后面的文件也无法接收,就会造成http队头阻塞。最老的http是一次一个请求响应。
http1.1默认说持久连接(keep-alive),请求和响应放在同一个连接里面,但是只有一个连接速度太慢,连接太多会造成DDos攻击。所以各家浏览器允许的持久连接数都不太相同。谷歌默认的是同时6个连接。http1.1当中有个管线化技术,单个连接可以发送多个请求,但是响应的时候按发送的顺序进行接收,就会造成很大的执行难度。(网络协议很难解决,所以开发层面会将小图标全部做成一张图片,在用js或者css把小图标分布到网站的各个部分,减少请求次数。)(Data Urls,图片用base64编码,然后就可以以字符的形式写进html或者css里面,但是编码的结果很长)(网站弄出多个域,使得浏览器可以下载这些资源,5张图片设置5个域名,然后浏览器就会同时下载了,就不用等前面资源下载后轮到下一个资源,也就是域名分片,但是开发复杂度提高)(把js、css加入到html中)。
TCP三次握手、TCP慢启动(减少网络的拥堵,拥塞控制)
http1.1的首部没有压缩且是明文。而且http1.1的请求和响应都有首部,包括很多重复的开销。
2.http/2
http/2的多路复用解决http/1.1的队头阻塞问题,减少了等待的时间。单个TCP连接进行交错发送请求和响应,请求和响应互不影响。
请求和响应被划分成各个不同的帧。帧可以分为首部帧和数据帧。把原本HTTP报文的首部和实体拆分成2个部分。
(http/2帧包括 长度、类型、标志、R、流标识符、负载)
流标识符可以按照顺序进行组合,而且帧类型中可以设置优先级标注流的权重。
http/2解决http/1.1的首部不压缩的问题,也就是http2进行了首部压缩,采用了HPACK的压缩算法。HPACK算法要求浏览器和服务器都保存一张静态只读的表。cookie的信息可以作为动态信息加入到动态表。Http/2的帧不是ASCII编码的报文,而是被提前转化为二进制的帧,解析起来更有效率。
(服务器推送可能会造成DDos攻击,有安全性问题)
http/2解决了应用层面的问题,但是http/2的传输层是基于tcp协议。tcp协议是由操作系统内核实现的。而且http2产生的那个年代也有tls了,为了传输的安全性,http2也会结合tls1.3一起使用,可加可不加但是不加浏览器会有安全提示。
原本tls1.2对应四次挥手,tls1.3调整成一来一回2次
3.http/3
http/3把tcp和tls的握手过程整合在一起了,减少了来回的开销。传输层用的UDP协议,并且添加了QUIC协议(整合了TCP和TLS),所以http3默认是使用加密传输。
QUIC帧包括:类型、流标识符、偏移量、数据长度、负载
用连接ID标识为同一个连接。http3的应用层没有帧的概念,把数据帧移到了QUIC帧里面,相当于在传输层有了数据帧,从源头解决数据阻塞的问题,实现多路复用。QUIC帧被封装为QUIC数据包,QUIC数据包包括标志、负载、连接ID。如果网络发送全面改变(wifi变4G网络),也就是Ip地址变了,但是客户端和服务器端已经协商好了连接ID,所以用连接id识别同一个连接,避免再次握手。QUIC数据包把QUIC帧加密,在TLS握手后,QUIC帧被加密了,QUIC数据包会被UDP封装成数据段,UDP加上端口号。选择hhtp3进行通信,QUIC就像TCP一样建立连接了。
4.三次握手、四次挥手
(1)三次握手
套接字socket=IP地址:端口号
TCP报文有syn、ack和fin等标识(1开启标识,0关闭标识)
1)首先在客户端发送TCP报文的时候,会把SYN开启(同步),
TCP是全双工的,所以可以支持互发信息。
2)服务器此时会把SYN和ACK(确认)开启,服务器也生成自己的序号。确认号等于对方的序号+1.
3)客户端进行确认,这边的序号用对方的确认号确认。

握手之后建立连接,客户端发起http请求,服务器端响应内容。
版本2:
在该过程中发送了三包数据,所以称为3次握手。
为什么要建立三次握手,而不是两次握手。
服务端回复完SYN+ACK包就建立连接,防止已失效的报文返回到服务器端引起错误。
比如SYN1包因为网络节点的原因被滞留,所以重发SYN2包,这次SYN2包顺利正常到达。服务端回复SYN+ACK包之后就建立了连接。第一包阻塞的节点又突然恢复,第一包的SYN包又送到服务端。这时服务端会误认为是客户端又发起了1个新的连接。从而在 握手之后进入等待状态。也就是客户端认为是1个连接,但是服务器端认为是2个连接,造成了状态不一致。
三次握手中,如果服务端收不到客户端的ACK包,自然不会认为连接建立成功。三次握手是为了解决网络信道不可靠的问题。为了在不可靠的信道建立起可靠的连接。经过三次握手之后,客户端和服务端都进入了数据传输状态。
一包数据可以拆成多包发送,如何处理丢包问题。以及数据包到达的先后顺序不同,如何处理乱序问题。t为了解决以上问题,tcp为每一个连接建立发送缓冲区,从建立连接后的第一个字节序列号为0,后面的每个字节的序列号都会增加1.发送数据时,从发送缓冲区取一部分数据组成发送报文,在tcp头会附带序列号和长度,接收端在收到数据后,需要回复确认报文,确认报文中的ACK=序列号+长度=下一包起始序列号。能够使发送端确认发送的数据已经被对方收到。
为什么客户端要进行超时等待时间,这时需要等待服务端收到ACK包。因为客户端在发送完最后一包ACK包就释放了连接。一旦ACK包在网络中丢失,服务端就一直处于最后确认的状态。如果客户端发送最后一包ACK包后,等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包。客户端会响应这个FIN包,重发ACK包并刷新超时时间。
··················
UDP协议是无连接的,就是把数据包从网卡发送出去,数据包之间并没有状态上的联系。资源占用少。
TCP(稳定可靠):传输文件、发送邮件、浏览网页。
UDP:速度快,但是可能产生丢包,适用于对实时性要求较高的,对少量丢包并没有太大要求的场景。(比如域名查询、视频直播、语音通话、VPN(隧道网络)。
三次握手解决信道不一致
(2)四次挥手
注意:客户端和服务端都能发起 关闭请求。
假设是客户端主动发起关闭请求
客户端会在报文中开启FIN和ACK控制位