网络
- OSI七层协议模型
- TCP/IP 五层/四层模型
- TCP/IP协议
- TCP三次握手
- TCP四次挥手
- TCP协议如何保证可靠传输
- 滑动窗口
- 拥塞控制
- TCP和UDP协议的区别
- UDP协议的应用
- 域名系统
- 一个网络数据包包括哪些
- UDP首部格式
- TCP首部格式
- TCP协议中的数据包分片与重组
- 请求响应报文
- 在浏览器中输入url地址 ->> 显示主页的过程
- HTTP和HTTPS的区别
- Https的加密过程
- SSL协议:
- HTTP请求中的Get和Post方法区别
- 常见的HTTP Code有哪些?
- cookie和session
- 长短连接
- HTTP1.0,HTTP1.1以及HTTP2.0区别
- 各种协议与HTTP协议之间的关系
- 路由汇聚
- 子网掩码
OSI七层协议模型
-
应用层:用户自定义,规定各个应用之间消息传递的形式等,包括各机互访协议,分布式数据库协议等
常见的应用层协议有HTTP协议和FTP
-
表现层:应用层数据的编码和转换功能
-
会话层:建立管理删除会话
-
传输层:负责将来自会话层的消息传递给网络层,建立端对端的数据连接,常见的传输层协议有TCP和UDP等协议。
-
网络层:规定通信网内的路由选择等方式,建立用户间的信息报传输设施。常见的网络层协议有IP,ICMP以及ARP等协议。
-
数据链路层:将网络层分组添加头尾部封装成帧,透明传输以及差错验证(CRC);
-
物理层:透明的比特流传输,根据信息在传输线上的方向可以分为单工通信;半双工通信;全双工通信
TCP/IP 五层/四层模型
TCP/IP协议
- 应用层:应用程序通信(http/https数据)
- 传输层:传输层的TCP模块负责给HTTP数据添加TCP头部等信息
- 网络层:网络层的IP模块负责给HTTP数据添加IP头部等信息
- 链路层:链路层添加以太网首部等信息,并且通过电信号来传输数据包
IP协议:
IP协议制定了一套网络地址,也就是IP地址,根据IP协议能够区分两台主机是否同属一个网络(子网)
ARP协议(地址解析协议):
- 根据IP地址获取MAC地址,将目标的IP地址在链路层进行包装,生成以太网数据包,在同一个子网内进行广播出去
- 各个主机拿到IP地址和自己的IP地址对比,若一样,则返回自己的MAC地址
- 注意,MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间。
路由协议
ARP的寻址必须是在同一个子网内,我们可以通过IP协议来确定是否是同一个子网。如果不是同一个子网,则通过网关将数据包多次转发到对应的子网中,完成这个路由协议的物理设备就是路由器
TCP三次握手
过程
- Client 将标志位 SYN 置为 1,随机产生一个值 seq=J,并将该数据包发送给 Server,Client 进入 SYN_SENT 状态,等待 Server 确认。
- Server 收到数据包后由标志位 SYN=1 知道 Client 请求建立连接,Server 将标志位 SYN 和 ACK 都置为 1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给 Client 以确认连接请 求,Server 进入 SYN_RCVD 状态。
- Client 收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给 Server
- Server 检查 ack 是否为 K+1,ACK 是否为 1,如果正 确则连接建立成功,Client 和 Server 进入 ESTABLISHED 状态,完成三次握手,随后 Client 与 Server 之间可以开始传输数据了
客户端状态变化
Close->SYN_SENT->ESTABLISHED的状态变化
为什么需要三次握手?两次可以吗
不可以,防止已经失效的连接请求报文突然又传输到服务器端导致的服务器资源浪费
- 第一次握手:Client什么都不能确认;Server确认了对方发送正常
- 第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常
- 第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送接收正常
不可以两次握手
为什么要传回syn
接收端传回发送端所发送的SYN是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
传了SYN,为啥还要传ACK
双方通信无误必须是两者互相发送信息都无误。传了SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要ACK信号来进行验证。
服务端状态变化
Close->Listen->SYN_RCVD->EATABLISHED的状态变化。
TCP四次挥手
过程
- 数据传输结束后,客户端的应用进程发出连接释放报文段,并停止发送数据,客户端进入 FIN_WAIT_1 状态,此时客户端依然可以接收服务器发送来的数据。
2.服务器接收到 FIN 后,发送一个 ACK 给客户端,确认序号为收到的序号+1,服务器进入 CLOSE_WAIT 状态。客户端收到后进入 FIN_WAIT_2 状态。
3.当服务器没有数据要发送时,服务器发送一个FIN报文,此时服务器进入== LAST_ACK状态, 等待客户端的确认
4.客户端收到服务器的 FIN 报文后,给服务器发送一个 ACK 报文,确认序列号为收到的序号 +1。此时客户端进入 TIME_WAIT== 状态,等待 2MSL(MSL:报文段最大生存时间),然后关闭连接。
客户端经状态变化
ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSE
服务端经历状态变化
ESTABLISHED->CLOSE_WAIT-> LAST_ACK->CLOSE
为什么断开连接需要四次
- 服务端响应断开连接的请求时,其ACK和FIN包并不是一起发送给客户端的
- 第一次由客户端->服务端的FIN信号表示的是客户端想要断开连接。服务端先给出ACK确认信号,表示已经收到FIN请求
- 然后当自己也可以结束的时候,再次发送FIN信号,所以需要挥手交互需要四次
四次挥手主动方为什么需要等待2MSL
- 主动关闭方在收到被动一方发出的FIN信号,会立马发送ACK确认信号,之后状态转变为TIME_WAIT,等待2MSL后才会进入CLOSE状态
- 主动关闭方需要等待2MSL是为了,防止最后一次ACK没有被正确的传给被动方,被动关闭方会再次发送第三次的FIN信号
(MSL表示最大报文生存周期,任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃)
TCP协议如何保证可靠传输
- 应用数据被分割成TCP认为最适合发送的数据块,TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层
- 校验和: TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段
- 超时重传: 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段,TCP的接收端会丢弃重复的数据
- 流量控制: TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的我数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是滑动窗口协议。 (TCP利用滑动窗口实现流量控制)
- 拥塞控制: 当网络拥塞时,减少数据的发送。
- 停止等待ARQ协议(stop and wait) 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组
超时重传
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。连续ARQ协议可提高信道利用率。发送维持一个发送窗口,凡位于发送窗口内的分组可连续发送出去,而不需要等待对方确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了
停止等待协议
停止等待协议
停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停下来等待对方确认。这样可使信道上一直有数据不间断的在传送。这种传输方式可以明显提高信道利用率。
滑动窗口
- 在三次握手阶段,双方互相将自己的最大可接收的数据量告诉对方,(数据接收缓冲池大小)
- 对方可以根据已发送的数据量来计算是否可以接着发送
- 在处理过程中,当接收缓冲池的大小发生变化时,要给对方发送更新窗口大小的通知,利用滑动窗口机制有效提高通信效率
拥塞控制
- 拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载
- TCP发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个
- TCP的拥塞控制采用了四种算法,慢开始 、 拥塞避免 、快重传和快恢复
慢开始
最开始发送方的拥塞窗口为 1,由小到大逐渐增大发送窗口和拥塞窗口。每经过一个传输轮次,拥塞窗口 cwnd 加倍。当cwnd超过慢开始门限,则使用拥塞避免算法,避免 cwnd 增长过大。
拥塞避免
一旦网络拥塞,就把慢开始门限设为当前值的一半,并且重新设置 cwnd 为 1,重新慢启动。
快重传
接收方每次收到一个失序的报文段后就立即发出重复确认,发送方只要连续收到三个重复确认就立即重传(尽早重传未被确认的报文段)。
快恢复
当发送方连续收到了三个重复确认,就将慢开始门限减半,将当前的 cwnd 设置为慢开始门限,并且采用拥塞避免算法(连续收到了三个重复请求,说明当前网络可能没有拥塞)
TCP和UDP协议的区别
- TCP需要三次握手建立连接,UDP无连接
- TCP确认机制,丢包重发,保证数据的正确性;UDP不保证正确性,只负责发送数据包。
- TCP协议可能会对大数据包进行拆分,并且在接收方进行重组数据包操作(所以会出现TCP的拆包粘包现象);UDP协议是面向报文的,不会进行分片和重组,所以需要注意传输的报文大小。
- 网络包中的TCP头部为20个字节;UDP头部只有8个字节。
UDP协议的应用
- UDP协议由于传输不需要建立连接,资源消耗较小。常用在视频或者语音传输中,域名解析服务DNS都使用了UDP协议。
域名系统
DNS 作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串
一个网络数据包包括哪些
网络数据包一般包括头部和数据部分
- 在TCP协议中,要发送的数据经过TCP模块添加TCP头部
- 然后IP模块添加IP头部和MAC头部
- 然后在最前面加上报头/起始帧分界符以及末尾加上FCS(帧校验序列),这样就构成了一个完成的数据包
UDP首部格式
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和
TCP首部格式
TCO首部20字节,
-
序号 :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
-
确认号 :期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
-
数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
-
确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
-
同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
-
终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
-
窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
TCP协议中的数据包分片与重组
当TCP传输的数据包比较大时,在接收方会进行分片,在接收方进行数据包的重组。
发送方:
- 将数据包分为多个TCP头部+数据包的组合,TCP头部中存着不同的数据序号
- 之后将多个组合交由IP模块,统一添加IP头部和MAC头部,IP头部的ID号设为统一的。
接收方:
IP模块具有分片重组功能,如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包
- 分片的包会在IP头部的标志字段中进行标记,当收到分片的包时,IP模块会将其暂时存在内存
- 然后等待IP头部中具有相同ID的包全部到达,因为同一个包的所有分片都具有相同的ID。按照IP头部的分片偏移量的字段,它表示当前分片在整个包中所处的位置进行重组
- 根据这些信息,在所有的分片全部收到之后,就可以将它们还原成原始的包。
MTU: Maxitum Transmission Unit 最大传输单元(IP头部+TCP头部+数据)
MSS: Maxitum Segment Size 最大分段大小,MSS就是TCP数据包每次能够传输的最大数据分段。(数据大小)
TCP/IP 数据链路层的交互过程
- 网络层到数据链层用== mac 地址==作为通信目标
- 数据包到达网络等准备往数据链层发送的时候, 首先会去自己的 arp 缓存表(存着 ip-mac 对应关系)去查找改目标 ip 的 mac 地址
- 如果查到了,就讲目标 ip 的 mac 地址封装到链路层数据包的包头
- 如果缓存中没有找到,会发起一个广播,收到广播的机器会检查自己的ip,是的话则将自己的mac地址以单拨的形式回复给请求机器
请求响应报文
请求报文
响应报文
在浏览器中输入url地址 ->> 显示主页的过程
- DNS解析
浏览器将域名解析为IP地址 - TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
HTTP和HTTPS的区别
- HTTP是超文本传输协议,数据明文传输;HTTPS在HTTP的基础上加入了SSL协议,实现数据的加密传输
- HTTPS需要区申请证书,一般是收费的;
- HTTP默认使用80端口,HTTPS默认使用443端口
Https的加密过程
- 客户端发起连接
- 服务端将CA证书发送给客户端并进行校验
- CA证书合法则客户端生成一对客户端公私钥和会话密钥,并将客户端公钥,会话密钥通过客户端公钥加密传输给服务端
- 服务端用服务端私钥解密后,生成服务端会话密钥,并将其用客户端公钥加密后发送给客户端
- 客户端用客户端私钥解密后拿到服务端会密钥,至此非对称加密结束
- 之后均为对称加密,客户端用服务端密钥加密http数据发送给服务端,服务端用客户端会话密钥加密http数据传给客户端
SSL协议:
- HTTPS协议在HTTP的基础上加入了SSL(安全套接字层)协议,SSL逐渐演变为了TLS协议,但是业界习惯仍然称其为SSL协议
- SSL协议在传输控制层的基础上建立了安全的连接,它作为一种通用可靠的安全解决方案,可与多种应用层协议结合使用,实现应用数据的安全传输
- SSL协议分为记录协议,握手协议,警告协议和密码规范改变协议
HTTP请求中的Get和Post方法区别
- Get一般用来从服务器上查询获取资源;Post一般用来更新服务器上的资源;
- Get方法将参数直接拼接在了URL后边,明文显示,可以通过浏览器地址栏直接访问;
- Post请求用于提交表单,数据不是明文的,安全性更高;
- Get请求有长度限制,Post请求没有
常见的HTTP Code有哪些?
- 1xx(临时响应)
- 2xx(成功) 200(成功)
- 3xx(重定向):表示要完成请求需要进一步操作
- 301:永久重定向
- 302 临时重定向
- 304(未修改):也表示临时重定向但是u要求客户端采用GET方式获取资源
- 4xx(错误):表示请求可能出错,妨碍了服务器的处理
- 400 请求报文存在语法错误
- 401(未授权):请求要求身份验证
- 403(禁止):服务器拒绝请求(比如死循环了,一直访问)
- 404(未找到):服务器找不到请求的网页
- 5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误
- 500 (服务器内部错误):有bug导致程序崩溃
- 502 (错误网关):服务器从上游接到了无效响应
- 504 ( 网关超时):nginx请求超时,请求一直没有返回
cookie和session
cookie和session来保持会话状态(sessionid典例)
-
用户发起请求,服务端收到请求处理后可以生成一个sessionId,并且将sessionId存入cookie中返回给客户端,将session的内容存储在服务器。在下一次的请求中,客户端带着cookie来请求服务器,服务端从cookie中取出sessionId,实现了用户会话状态的保持
-
在用户量较大的情况下,服务器容量会不足。实际情况中,经常是将所需要的会话状态,比如说登录态直接存入cookie并且返回给客户端,下次请求时,服务端直接取出cookie中的信息和参数信息进行比较,保持HTTP会话状态
-
session保存在服务端。cookie保存在客户端,并且cookie有大小限制
长短连接
- 短连接每一次http请求都要简历一次连接
- 长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信
- http1.1之前默认短连接,要使用长连接要添加字段Connection:Keep-Alive
- http1.1之后默认使用长连接。断开连接需要服务器或客户端提出断开,使用Connection:close;
HTTP1.0,HTTP1.1以及HTTP2.0区别
HTTP1.0
- HTTP1.0是一种无状态,无连接的协议
- 浏览器的每次请求都需要与服务器建立TCP连接,服务器处理完成后立即断开TCP连接(无连接)
- 服务器不跟踪每个客户端也不记录过去的请求(无状态)。也就是默认使用Connection: close
HTTP1.1
- HTTP/1.1中默认使用Connection: keep-alive,避免了连接建立和释放的开销
- 服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容
- 通过Content-Length字段来判断当前请求的数据是否已经全部接收,不允许同时存在两个并行的响应
HTTP2.0
- HTTP2.0协议新增了二进制分帧,多路复用,头部压缩和服务器推送等功能,进一步提高了传输效率
各种协议与HTTP协议之间的关系
路由汇聚
路由汇聚是指把一组路由汇聚为一个单个的路由广播,路由汇聚优点是可以缩小网络上的路由表的尺寸。
算法实现
将各子网地址的网段以二进制写出。从第1位比特开始进行比较,将从开始不相同的比特到末尾位填充为0。由此得到的地址为汇总后的网段的网络地址,其网络位为连续的相同的比特的位数。
算例
假设下面有4个网络:
1 172.18.129.0/24
2 172.18.130.0/24
3 172.18.132.0/24
4 172.18.133.0/24
这四个进行路由汇聚,那么能覆盖这四个网络的汇总地址是:172.18.128.0/21
具体计算方式如下:
129的二进制代码是10000001
130的二进制代码是10000010
132的二进制代码是10000100
133的二进制代码是10000101
- 这四个数的前五位相同都是10000,所以加上前面的172.18这两部分相同的位数,网络号就是8+8+5=21
- 而10000000的十进制数是128,所以,路由汇聚的IP地址就是172.18.128.0。所以最终答案就是172.18.128.0/21
子网掩码
根据划分的子网数
算法实现:在求子网掩码之前必须先搞清楚要划分的子网数目,以及每个子网内的所需主机数目。
将子网数目转化为二进制来表示
取得该二进制的位数,为 N
取得该IP地址的类子网掩码,将其主机地址部分的前N位置1 即得出该IP地址划分子网的子网掩码。
举例:
如欲将B类IP地址168.195.0.0划分成27个子网,则其子网掩码为255.255.248.0
27=11011
该二进制为五位数,N = 5
将B类地址的子网掩码255.255.0.0的主机地址前5位置1(B类地址的主机位包括后两个字节,所以这里要把第三个字节的前5位置1),得到 255.255.248.0
根据每个子网中的主机数
算法实现:利用主机数来计算。
将主机数目转化为二进制来表示
如果主机数小于或等于254(注意去掉保留的两个IP地址),则取得该主机的二进制位数,为 N,这里肯定N<8。如果大于254,则 N>8,这就是说主机地址将占据不止8位。
使用255.255.255.255来将该类IP地址的主机地址位数全部置1,然后从后向前的将N位全部置为 0,即为子网掩码值。
举例:
如欲将B类IP地址168.195.0.0划分成若干子网,每个子网内有主机700台,则其子网掩码为:255.255.252.0
700=1010111100
该二进制为十位数,N = 10
将该B类地址的子网掩码255.255.0.0的主机地址全部置1,得到255.255.255.255
然后再从后向前将后10位置0,即为: 11111111.11111111.11111100.00000000
即255.255.252.0