-
TCP/IP网络模型
- 包含应用层,传输层,网络层,数据链路层,物理层
- 应用层:用户直接接触到的,应用软件实现在应用层。应用层工作在操作系统的用户态。
- 传输层:为应用层提供网络支持,不负责传输数据,有TCP/UDP两个传输协议。TCP报文中携带了端口号,区分是哪个应用进程在传输数据。
- 网络层:负责传输数据。IP协议。
- IP协议的作业:寻址-->找到要传输到哪一台设备上(目的地去哪儿?);路由-->两台设备之间可能有很多条网络路径,数据包到达一个网络节点时,根据算法决定接下来走哪一条网络路径(去目的地应该怎么走?)。
- IP头部包含了源地址和目的地址
- 数据链路层:数据需要跨网络传输时,需要一个设备在两个网络之中,这个设备就是路由器。
- 数据链路层用来标识网络中的设备
- 为网络层提供链路级别的服务
- 物理层:将数据包转化为电信号,让其可以在物理介质中传输。
-
HTTP(超文本传输协议)
- 一个在计算机世界中在【两点】之间【传输】文字图片音频视频等【超文本】数据的【约定和规范】
- 五大类状态码:1** --> 提示信息,协议处理中间状态;2** --> 处理成功;3** --> 重定向,资源位置发生变动,需要重新发送请求;4** --> 客服端错误,请求的报文有误,服务器无法处理;5** --> 服务器处理,服务器处理请求时内部错误。
- http的优点:简单灵活,易于扩展,应用广泛,跨平台
- 缺点:无状态(Cookie可以记录状态,用于解决无状态问题)。明文传输不安全,内容可能会被监听,不验证通信方的身份(遭遇伪装),无法验证报文的完整性(内容可能会被篡改)。
- HTTP的安全问题可通过HTTPS解决(通过引入SSL/TLS层)
- 早期的http1.0:
- 每发起一个请求都要建立一次TCP三次握手,增加了通信开销
- 串行机制,请求A发出并收到服务器响应之后,请求B才能发出
-
http1.1
- 提出了长连接方式,持久连接,减少了TCP重复连接和断开的额外开销,减轻了服务端的负载
- 管道机制,只要请求A发出后,不用等待其回来,请求B可以继续发出。减少了整体响应时间
- 还是存在着队头堵塞问题,服务器对A的请求未响应,则请求B及以后的请求都阻塞住,客户端一直无法请求到数据。
- 请求响应头部信息未经压缩就发送,首部信息越多延迟越大
- 发送了冗长的首部,并且很多请求中发送了相同的首部,浪费较多。
- 请求只能从客户端开始,服务器只能被动响应
- 如何优化HTTP1.1?(三个思路:避免发送http请求;要发送http请求时,减少请求次数;减少服务器响应数据大小)
- 避免发送http请求:使用缓存机制
- 减少http请求次数:减少重定向次数,合并请求(减少重复发送的http头部信息,减少TCP建立连接的次数),延迟发送请求(按需获取)
- 减少服务器响应的数据大小:无损压缩,有损压缩
-
http2
- HPACK算法进行头部压缩,消除重复部分
- 静态字典,动态字典,Huffman压缩算法
- 二进制格式传输
- 二进制帧
- 多路复用解决队头阻塞,并发传输
- 服务器主动推送消息
- HPACK算法进行头部压缩,消除重复部分
-
http3(未普及)
- 将http2中将HTTP下层的TCP改成了UDP
- HTTP和HTTPS的区别
- TLS1.2四次握手
- 第一次握手:客户端发送【Client Hello】信息,携带了客户端的TLS版本号,一个随机数(Client Random),支持的密码套件列表
- 第二次握手:服务器收到【Client Hello】信息后,返回【Server Hello】消息,里面携带了确认的TLS版本,服务器生成的随机数(Server Random),选择的一个合适的密码套件。然后服务器发送【Server Certificate】消息,里面携带了数字证书信息。最后发送【Server Hello Done】消息,表示本次发送完毕
- 第三次握手:客户端验证证书有效之后,生成一个新的随机数(pre-master),数字加密后通过发送【Change Cipher Key Exchange】消息给服务器。服务器收到解密之后,双方根据共享的三个随机数生产会话密钥(用于解密后续传输的加密数据),然后客户端发送【Change Clipher Spec】告诉服务器开始使用加密传输。最后客户端发送【Encrypted Handshake Message】消息,用于验证加密通信和解密是否可用。
- 第四次握手:服务器发送【Change Clipher Spec】和【Encrypted Handshake Message】消息,同样用于验证加密通信和解密是否可用。
- 最后用【会话密钥】加密和解密http的通信
- 如何优化HTTPS?
- 相比于HTTP, HTTPS的性能消耗多了两个方面:1.TLS协议握手过程;2.握手后的对称加密报文传输
-
TCP
- TCP头部格式
- 客户端和服务端建立一个TCP连接需要达成三方面信息的共识:socket(IP地址和端口号等),序列号(解决乱序问题等),窗口大小(用于流量控制)
- TCP三次握手
- 第一次握手:一开始服务器处于监听(LISTEN)状态,客户端随机初始化序列号(client_isn),同时将SYN位置为1表示希望建立连接。将这个SYN报文发送给服务器端,之后客户端处于SYN-SENT状态。
- 第二次握手:服务器收到客户端发送的SYN报文后,初始化了服务端的序列号(server_isn),在确认应答号处填入client_isn+1,然后将SYN和ACK位置为1,然后发送给客户端,随后服务端处于SYN-RCVD状态
- 第三次握手:客户端收到服务端报文之后,将ACK置为1,确认应答好设置为server_isn+1,然后发送给服务端,此次发送的报文可以携带服务器数据之后,客户端处于ESTABLISHED状态,服务端收到之后也进入ESTABLISHED状态
- 为什么是三次握手,不是二次或者四次?
- 三次握手才可以防止旧的重复连接初始化造成的混乱(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
- TCP四次挥手
- 第一次挥手:假如客户端准备断开连接,首先会发送一个FIN位置为1的TCP头部的FIN报文给服务端,然后客户端进入FIN_WAIT_1状态
- 第二次挥手:服务器收到FIN报文后,向客户端发送ACK应答报文,然后服务端进入CLOSED_WAIT状态,客户端收到应答报文之后,进入FIN_WAIT_2状态,等待服务端处理完数据,然后向客户端发送FIN报文,之后服务端进入LAST_ACK状态
- 第三次挥手:客户端收到收到FIN报文之后,回一个ACK应答报文,然后进入TIME_WAIT状态
- 第四次挥手:服务端收到ACK应答报文,进入CLOSED状态,此时服务器端完成了连接的关闭;客户端在经过一段时间(一般是TIME_WAIT状态持续2MSL(报文最大生存时间,Linux中1MSL为30s))等待后也自动进入CLOSED状态,此时客户端也完成了连接的关闭。
- 两端各发送了一个FIN和ACK报文;主动关闭连接的才有TIME_WAIT状态
- 为什么TIME_WAIT持续2MSL?
- 1.防止旧连接的数据包;2.保证被动关闭连接的一方能够正确的关闭,即保证最后的ACK报文能被服务器接收到,从而使其正确地从LAST_ACK状态进入CLOSED状态。
- 为什么挥手需要四次?
- 挥手过程需要先把正在处理的数据处理完成,所以服务器端中途会等待一段时间之后再发生FIN报文,所以成了四次。
- TCP重传机制(通过序列号和确认应答号实现可靠传输)
- 超时重传(时间RTO设置很重要)
- 快速重传
- 滑动窗口
- 流量控制
- 让「发送⽅」根据「接收⽅」的实际接收能⼒控制发送的数据量,防止处理不过来而导致重传
- 拥塞控制
- TCP头部格式
-
IP网络层
- MAC 的作⽤:实现「直连」的两个设备之间通信, IP :负责在「没有直连」的两个⽹络之间进⾏通信传输
- 数据传输过程中,源IP地址和目的IP地址一直未变化,而源MAC地址和目的MAC地址会变化。
- DNS域名解析(将域名解析为具体的IP地址)
- 当浏览器键入一个域名时,首先会查看浏览器缓存是否有该域名的IP地址,如果没有则询问操作系统的缓存,如果没有就检查本地域名解析文件hosts,如果还是没有就会使用DNS故武器进行查询:
- 当浏览器键入一个域名时,首先会查看浏览器缓存是否有该域名的IP地址,如果没有则询问操作系统的缓存,如果没有就检查本地域名解析文件hosts,如果还是没有就会使用DNS故武器进行查询:
- ARP协议:借助主机广播ARP请求和接收APR响应的包确定下一级的MAC地址(已知IP地址求MAC地址)
- RARP协议:已知MAC地址求IP地址
- DHCP:最常用的,用来动态获取IP地址
- 浏览器中键入一个URL链接到显示网页发生了什么?
- 浏览器解析URL,确定要访问的Web服务器名和文件名,
- 然后询问DNS服务器查询访问地址的IP地址,然后生成HTTP信息委托给操作系统进行发送,
- 建立TCP三次握手连接,数据长度大于MISS长度时进行TCP分割数据,然后生成TCP报文(TCP头部+HTTP报文+数据)
- 委托IP模块将数据封装成网络包进行发送:生成IP报文(里面有源和目的IP信息进行寻址);生成MAC头部进行路由,发送给下一个路由器(里面有源和目的MAC信息进行路由),此时就是MAC头部+IP头部+TCP头部+HTTP报文+数据
- 网络包只是一堆二进制文件,需要网卡转换为电信号才能在网线传输(这才是真正的发送)select