OSI七层协议
物理层:比特流
数据链路层:封装成帧、差错检测
网络层:实现网络中两个主机之间点对点的通信。 路由寻址 ARP协议、IP数据包
IP分片是在IP数据包超过了数据链路层MTU=1500字节的大小时进行分片
ICMP协议,互联网控制报文协议;ICMP协议主要功能是确认IP包是否成功到达目标地址、报告发送过程中IP包被废弃的原因等;
ICMP分为查询报文类型和差错报文类型
传输层:为网络中两个终端应用程序之间提供端到端的数据通信。TCP、UDP
会话层:
表示层:
应用层:
浏览器输入一个url会发生什么?
1.DNS解析域名的IP地址
2.TCP连接
3.发送HTTP请求
4.服务器处理请求并返回HTTP报文
5.浏览器解析渲染页面
6.连接结束
使用的协议:DNS、TCP、IP、OSPF、ARP、HTTP
- 浏览器输入URL后,首先对这个URL地址进行解析,确定域名和需要请求的资源文件的路径
然后生成HTTP报文,生成完成后,现在还不知道要发往哪里
- 通过DNS查询域名对应的IP地址,首先浏览器会查询浏览器缓存,然后操作系统也会查询自己的缓存,还有host文件中有没有对应的域名的缓存,如果没有,最后再去问本地域名服务器
- 本地域名服务器会向根域名服务器发送请求,根域名服务器会告知本地域名服务器下一次请求的顶级域名服务器地址,然后本地域名服务器继续发起请求;请求经过根域名服务器->顶级域名服务器->最后到权威级别的域名服务器,找到对应的IP地址
- 通过DNS获取IP地址后,浏览器会将HTTP报文的传输工作交给操作系统中的协议栈,协议栈上部分是TCP/UDP,经过TCP封装一个TCP头部,TCP头部主要包括源端口、目的端口、序号、确认序号、状态位、窗口大小(进行流量控制),如果HTTP数据包的长度超过了MSS(TCP最大报文长度)那么TCP会将HTTP报文进行拆分。
- 这些数据包在网络层由IP层封装一个IP头部,由IP协议进行发送,IP头部有源IP地址、目的IP地址、协议(06TCP)、片偏移等,在DNS查询到的IP地址在此处就放入目的IP地址字段
- 经过数据链路层封装成帧、物理层的网卡、交换机、路由器到达另一台主机,实现发送的过程,接受过程就是拆头部的过程,就实现了两台主机之间的通信。
DNS的递归查询和迭代查询
递归查询一般是本机向本地域名服务器的查询
迭代查询一般是本地域名服务器向根域名服务器的查询
HTTP协议
HTTP请求
HTTP请求报文格式:请求行、请求头、请求报文
HTTP响应报文格式:状态码、响应报头、响应报文
状态码:
1xx 正在处理
2xx 成功
3xx 需要重定向
4xx 客户端错误
5xx 服务端错误
Get请求和POST请求的区别
GET请求是用来请求资源
POST请求提交表单用来更改服务器的资源
GET请求具有幂等性,POST请求不具有幂等性
GET请求可以被缓存,POST请求不能被缓存
HTTP1.0和1.1的区别
1.HTTP长连接短连接
HTTP1.0的时候是短连接,每次请求完连接就会断开,重新请求时重新建立连接
HTTP1.1的时候是长连接,请求头有Connection: keep-alive,当一个网页打开完成后,不会立即断开TCP连接,会等待一段时间后再断开,如果中间有请求再次请求,那么会继续使用这条TCP连接
2.状态响应码新增 请求大资源之前的预热请求 100、范围请求206
3.缓存处理,HTTP1.1加入了更多可供选择的字段来控制缓存策略
4.带宽优化及网络连接的使用。HTTP1.1支持断点续传的功能,可以允许请求资源的某个部分,返回码是206(Pratial Content)
- 支持长连接
- 支持管道传输,每次发送请求不需要等请求回来,就可以发送下一个,减少整体的响应时间,但是服务端必须按照请求的顺序发送对这些管道化的请求
HTTP2.0和HTTP1.1的区别
- 头部压缩
- 二进制格式
- 数据流
- 多路复用
- 服务器推送
HTTP缓存技术
分为强制缓存、协商缓存
强制缓存:当HTTP请求返回时,Response中会有一个Cache-Control 字段,用来定义缓存过期的时间
或者Expire字段也可以实现
协商缓存:请求头部的If-Modified-Since 和 响应头部的Last-Modified
HTTP和HTTPS的区别
1.端口
2.协议
HTTPS=HTTP+SSL/TLS
非对称加密和对称加密
非对称加密是指加密和解密的密钥不同
对称加密的加密和解密的密钥是相同的
HTTPS加密的过程
使用非对称加密
- 客户端向服务端的443端口发起HTTPS请求
- 服务端返回一个安全证书(携带公钥),服务端还有一个私钥(非对称加密,公钥加密,私钥解密)
- 客户端验证证书合法后,使用这个证书生成客户端密钥
- 再用公钥将客户端生成的密钥进行加密并传输给服务端
- 服务端收到加密后的数据后,使用私钥进行解密,得到客户端的密钥
- 此后的传输使用客户端的密钥进行对称加密
TCP
报文结构
源端口、目的端口、序列号、确认序号、标记位、窗口大小、校验和
三次握手
tcp连接client和server有哪些状态
TCP通过三次握手建立连接
第一次客户端向服务端发送SYN=1,seq=x的请求报文
第二次服务端发送ACK=1,ack=x+1,seq=y确认报文
第三次客户端发送ACK=1,ack=y+1,seq=x+1确认报文
为什么要通过三次握手建立连接不是两次握手?
如果是两次握手,当客户端发送SYN=1的请求建立连接的报文时,如果因为网络原因,这个报文滞留了,过了很长时间才到达服务端,因为客户端迟迟收不到确认报文,触发了超时计时器,重发了SYN=1的请求报文。此时服务端收到两个SYN=1的请求报文,如果是两次握手,那么就会建立两个TCP连接,浪费服务端的资源;
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
四次挥手
time_wait状态
当TCP断开连接时,会进行四次挥手断开连接
第一次客户端主动发起FIN=1,seq=x的断开连接的请求报文
第二次服务端发送ACK=1,seq=y,ack=x+1的确认报文
第三次,当服务端发送完数据,可以断开连接时,服务端发送FIN=1,seq=u,ack=x+1的断开连接的报文
第四次,客户端发送ACK=1,seq=x+1,ack=u+1的确认报文
Time_WAIT状态为什么要等到2MSL
一个MSL保证四次挥手中,客户端最后发送的确认报文能够达到服务端
一个MSL保证如果服务端没有收到确认报文,那么进行重传的FIN报文能够到达客户端
TCP和UDP的区别
概念上的区别:
UDP是无连接的、基于数据包的传输层协议,接收消息的服务端不需要给出任何确认,不提供可靠交付。
TCP是面向连接的、可靠的、基于字节流的传输层协议,需要三次握手来建立连接。
使用场景上的区别:
TCP一般用于文件传输。
UDP主要用于语音电话、视频电话、直播等场景
TCP通过以下几种机制保证连接的可靠性?
1.校验和
2.拥塞控制
3.ARQ协议
4.超时重传
超时重传的时间略大于RTT(包的往返时间)
5.流量控制
ARQ协议
ARQ协议包括:等待ARQ协议和连续ARQ协议
等待ARQ协议等待上一个发送的数据的确认报文到达后才会继续发送,出现差错会超时重传
连续ARQ协议,发送方维护一个发送窗口,凡是发送窗口内的都可以发送出去,不需要等待对方的确认,接收方采用累计确认的方式,对按序到达的报文只确认最后一个报文
拥塞控制
为了进行拥塞控制,发送方维护一个拥塞窗口,并随网络状态而动态变化,发送方让自己的发送窗口取拥塞窗口和接收窗口的最小值。
拥塞控制包括四种算法慢开始、拥塞避免、快重传、快恢复
慢开始:将窗口值从1开始从小到大增加,每过一个传播轮次,窗口值翻倍
拥塞避免:当窗口值达到门限值时,每经过一个传播轮次,窗口值只会增加1
快重传和快恢复:当发送方收到三个重复确认时,则一定是某个数据包丢失了,立即重传该数据包
滑动窗口和流量控制
TCP采用滑动窗口来实现流量控制,流量控制是为了抑制发送方的发送速率,使得接收方来得及接收,接收方确认报文中的窗口字段可以控制发送方的窗口大小,影响发送方发送数据的速率。
滑动窗口
为什么需要滑动窗口?
我们知道TCP是每发送一个数据,都要接收一个应答,上一个数据包接收到应答了,才会继续下一个数据包的发送,这样的方式有个缺点是:往返时间越长,通信效率越低。
为了解决这个问题,TCP引入了 窗口 的概念,即使往返时间很长,也不会降低通信的效率
有了窗口,就可以指定窗口的大小,窗口的大小表示无需等待确认应答,便可以继续发送数据包数量的最大值
接收方采用累计确认的方式
发送方窗口大小是由接收方的窗口来决定的