计算机网络
网络结构
最常用的网络分层协议是分为5层的TCP/IP网络模型
应用层:应用层是我们接触的应用软件,负责把数据传给传输层
传输层:有两个传输协议TCP与UDP,应用层数据过大时,会分块成TCP段;且传输层报文中会携带端 口号
网络层:网络层常用协议是IP协议,将上述报文加上ip地址,如果数据量过大还会进行分片
数据链路层:专门用于标识网络中的设备即MAC地址,用于中间传输
物理层:为数据链路层提供二进制传输的服务
HTTP
http是超文本传输协议,是一个在计算机世界里专门在两点之间传输文字图片等超文本数据的约定和规范。
HTTP与HTTPS的区别
- HTTP是明文传输,存在安全风险问题。HTTPS则解决HTTP不安全的缺陷,再TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。
- HTTP建立连接相对会简单,TCP三次握手之后便可以进行HTTP得报文传输。而HTTPS在TCP三次握手之后还需要进行SSL/TLS的握手过程才可以加密报文传输
- HTTP端口号是80,HTTPS端口号是443
- HTTPS协议需要向证书权威机构申请数字证书来保证服务器的身份是可信的。需要收费。
http由于明文传输存在安全风险。而HTTPS通过混合加密的方式实现了信息的机密性,解决了窃听的风险;通过摘要算法的方式实现了完整性,能够为数据生成独一无二的指纹,指纹用于校验数据的完整性,解决了篡改的风险。将服务器公匙放入到了数字证书中,解决了冒充的风险。
HTTP1.0、HTTP1.1、HTTP2.0和HTTP3.0的区别
a.http1.0:
i.特点:短连接,每次浏览器请求都需和服务器建立一个TCP连接,而且是串行请求,即等服务器恢复了再发送
ii.缺点:增加了连接的建立和释放的开销
iii.为什么要用短连接:因为以前上网只是浏览网页,用户无需发送太多请求,交互不频繁,如果长时间占用一个连接,高并发情况下资源容易被浪费
b.http1.1:
相比于1.0新增了哪些功能?
1.提出了长连接的通信方式,只要任意一方没有明确提出断开连接则保持TCP连接状态
2.长连接的方式使得管道网络传输成为了可能。在同一个TCP连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发送第二个请求出去可以减少整体的响应时间
3.增加了host字段。1.0认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。而虚拟主机技术的发展,一台物理服务器上有多个虚拟主机共享一个IP于是增加了host字段区分
存在的缺点:
队头阻塞:长连接实现了管道网络传输,客户端可以发起多个请求,可是服务端还是按照顺序先回应A的请求,完成后在回应B的请求。要是前面的回应特别慢,后面就有许多请求排队等着。这成为队头阻塞。而且没有请求优先级控制,请求只能从客户端开始,服务端只能被动响应。
c.http2.0
i.HTTP2.0协议是基于HTTPS的,所以HTTP2.0的安全性高
ii.相比于1.1的性能改进:
1.引入二进制分帧层。HTTP2.0不再像HTTP1.1里纯文本形式的报文,而是使用二进制格式,头信息和和数据体都是二进制,并且统称为帧
(报文是计算机网络中用于交换信息的基本单位,它包含了站点一次性要发送的完整数据信息)
2.头部压缩。HTTP2.0会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或者是近似的,那么协议会帮你消除重复部分。
3.使用了多路复用技术。HTTP2.0是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应。移除了HTTP1.1中的串行请求,不需要排队等待,也就不会再出现队头阻塞问题。
4.HTTP2.0的数据包不是按顺序发送的,同一个连接里面连续的数据包可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。规定客户端发出的数据流编号为奇数,服务器发出的数据流编号为偶数。
5.服务器可以主动向客户端发送消息。
iii.缺点
HTTP2.0多个HTTP请求复用一个TCP连接,一旦发生丢包就会阻塞住所有的HTTP请求
HTTP3.0
将TCP协议改为UDP协议,UDP无队头阻塞;UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议(谷歌提出) 可以实现类似 TCP 的可靠性传输。
TCP和UDP的区别
1.连接:TCP面向连接,UDP面向无连接
2.服务对象:TCP一对一,UDP一对一、一对多与多对多
3.可靠性:TCP可靠,UDP尽全力交付
4.TCP拥有拥塞控制与流量控制
5.TCP的头部开销比UDP大
TCP的三次握手
为什么要三次握手,而不是二次、四次?
- 三次握⼿才可以阻⽌重复历史连接的初始化(主要原因)
- 三次握⼿才可以同步双⽅的初始序列号
- 三次握⼿才可以避免资源浪费
两次握手无法阻止上述问题,四次握手中的服务器端回复数据ACK+SYN可以合并发送,因可以算作三次握手
为什么每次建立TCP连接初始序列号都不一样?防止接受历史报文
如果已经建立了连接但是客户端突然出现了故障怎么办?
TCP有保活机制。定义一个时间段,在这个时间段内如果没有任何连接相关的活动,TCP保活机制开始作用,每隔一个时间段会发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应就认为当前的TCP连接已经死亡。
TCP的四次挥手断开连接
双方都可以主动断开连接。
- 为什么需要四次挥手?
- 发起断开时,客户端向服务端发送 FIN 报文,客户端此时不发能收;
- 服务器端收到 FIN,先返回 ACK应答报文,然后服务器可能要处理和发送数据,等服务器端呢不在发送时,才发送 FIN 报文给客户端表示同意现在关闭。
- 由此可知,服务器端的回复ACK+FIN间隔可能要处理数据,要分开发送,所以要四次握手
- 为什么需要 TIME_WAIT 状态?
- 防⽌具有相同「四元组」的「旧」数据包被收到;
- 保证「被动关闭连接」的⼀⽅能被正确的关闭,即保证最后的 ACK 能让被动关闭⽅接收,从⽽帮助其正常关闭;
- 为什么 TIME_WAIT 等待的时间是 2MSL?
- MSL 是 Maximum Segment Lifetime,报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这个时间报⽂将被丢弃。
- TIME_WAIT是客户端收到服务器端的 FIN 报文后发送 ACK 开始计时的,如果服务器端没收到ACK,则会重发 FIN报文,客户端收到重发的报文,则2MSL会重新计时。服务器端FIN + 客户端ACK一来一回正好2个MSL。
SYN泛洪攻击
TCP 连接建立是需要三次握手,假设攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到 一个 SYN 报文,就进入 SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的ACK 应答,久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务。
处理方法是通过防火墙,或者增大半连接队列,缩短超时时间。
流量控制与拥塞控制
流量控制
问题:发送⽅不能⽆脑的发数据给接收⽅,要考虑接收⽅处理能⼒。
为了解决这种现象发⽣,TCP 提供⼀种机制可以让「发送⽅」根据「接收⽅」的实际接收能⼒控制发送的数据量,即流量控制。
TCP中的流量控制主要基于滑动窗口机制来实现,也有助于避免网络拥塞。通过限制发送速率,流量控制可以防止发送方发送过多的数据,导致网络拥塞。
拥塞控制
- 流量控制是避免「发送⽅」的数据填满「接收⽅」的缓存,但是并不知道⽹络的中发⽣了什么。在⽹络出现拥堵时,如果继续发送⼤量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是⼀重传就会导致⽹络的负担更重,于是会导致更⼤的延迟以及更多的丢包,这个情况就会进⼊恶性循环被不断地放⼤
- 于是引入拥塞控制,⽬的就是避免「发送⽅」的数据填满整个⽹络。
一个网页请求的流程
1.浏览器输入网址,解析URL,确定Web服务器和文件名,根据这些信息生成HTTP请求消息;
2.通过DNS域名解析查询服务器域名对应的IP
3.把HTTP请求命令交给操作系统的协议栈(此部分包含传输层TCP/UDP和网络层IP)
4.TCP首先进行三次握手建立连接,然后TCP对HTTP请求信息进行拆分并添加TCP头部
5.IP模块负责将上述数据封装成网络包(添加IP头部)发送给通信对象
6.生成IP头部后,在前面再加入MAC头部,用于两点传输
7.利用网卡和网卡驱动程序将二进制的网络包转成电信号进行传输
8.交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口
9.网络包经过交换机之后,到达路由器并在此被转发到下一个路由器或目标设备
10.客户端和服务端对数据进行确认解析
11.客户端处理完数据后向服务器发起了TCP四次挥手,至此双方的连接就断开了
HTTP请求转发与重定向流程
重定向
请求转发