计算机网络面试题

目录

计算机网络体系结构

一:请详细介绍一下TCP三次握手机制​​​​​​​

二:TCP握手为什么是三次,两次不行吗,四次呢

三:说说TCP四次挥手过程

四:为什么要四次挥手,三次不行吗

五:为什么要等待2MSL的时间才关闭?

六:为什么需要 TIME_WAIT 状态?

七:如何理解HTTP协议是无状态的

八:从浏览器地址栏输出url到显示主页的过程

九:说下HTTP/1.0,1.1,2.0区别

1.1,2.0区别

十. 在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?

十一:HTTP和HTTPS的区别

十二(1):Http流程

十二(2):Https流程

十三:说说HTTP的状态码,301和302的区别?

十四:什么是数字签名,什么是数字证书?

十五:对称加密与非对称加密有什么区别

十六:如何设置长连接?

十七:长连接在什么时候会超时呢?

十八:说说DNS的解析过程?

十九: 什么是DoS、DDoS、DRDoS攻击? 

二十:什么是XSS攻击,如何避免?

二十一:聊聊SQL注入

二十二:Cookie和Session的区别

二十三:IP地址有哪些分类

二十四:说一下ARP工作协议的过程

二十五:有了IP地址,为什么还要用MAC地址

二十六:TCP 和 UDP 分别对应的常见应用层协议有哪些? 

二十七:聊聊保活计时器作用 

二十八: URI和URL的区别

二十九:ICMP协议的功能

三十:Ping原理

三十一:TCP和UDP的区别

三十一: 聊聊TCP的流量控制 

 三十二:TCP的拥塞控制

思路讲解: TCP拥塞机制也是个高频考点,需要掌握它跟流量控制的区别,也需要掌握拥塞控制的这几种算法:慢启动算法、拥塞避免、拥塞发生、快速恢复算法。

慢开始

快重传 

快恢复 

三十三 :说说TCP是如何确保可靠性的呢?

三十四:Nagle 算法与延迟确认


计算机网络体系结构

TCP在运输层

IP在网络层

一:请详细介绍一下TCP三次握手机制

TCP是通过三次握手来建立可靠连接的,三次握手的目的就是同步连接双方的序列号,确认号以及TCP的窗口大小信息,具体如下:

第一次握手:客户端发送SYN=1,ACK=0,seq=x给服务端,客户端进入SYN_SEND状态

第二次握手:服务端发送SYN=1,ACK=1,seq=y,ack=x+1给客户端,服务端进入SYN-RCVD状态

第三次握手:客户端发送ACK=1,seq=x+1,ack=y+1,发送完毕后,客户端进入ESTABLISHED状态,当服务器端接收到这个包时,也进入ESTABLISHED状态。

二:TCP握手为什么是三次,两次不行吗,四次呢

防止服务端一直等待,浪费资源

如果客户端发送的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达服务端,这本已经是一个失效的连接,但是服务端收到请求后,会误以为是客户端发起的重新再建立一次连接,服务端就会向客户端发送确认报文段,同意建立连接,如果不采用三次握手,新的连接就建立了,但是客户端并没有建议连接的意思,不会理会服务端,服务端又一直等待客户端发来的确认,这样,服务端的很多资源就浪费了。

PS:从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题。

三:说说TCP四次挥手过程

第一次挥手:客户端发送FIN=1,ACK=1,seq=u,客户端进入FIN-WAIT-1状态

第二次挥手:服务端发送ACK=1,seq=v,ack=u+1,服务端进入CLOSE-WAIT状态

第三次挥手:服务端发送FIN=1,ACK=1,seq=w,ack=u+1,服务端进入LAST-ACK状态

第四次挥手:客户端发送ACK=1,seq=u+1,ack=w+1,客户端进入TIME-WAIT状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSED状态。服务器端接收到这个确认包之后,关闭连接,进入CLOSED状态。

.

四:为什么要四次挥手,三次不行吗

因为TCP是全双工通信,服务端需要等待,并完成数据的发送和处理,所以服务端的ACK和FIN都会分开发送,从而比三次握手多了一次。

五:为什么要等待2MSL的时间才关闭?

1.为了保证连接的可靠关闭。如果server没有收到最后一个ACK,那么就会重发FIN

2. 防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。

六:为什么需要 TIME_WAIT 状态?

原因一:防止旧连接的数据包

假设 TIME-WAIT 没有等待时间或时间过短,被延迟的数据包抵达后会发生什么呢?

  • 如上图黄色框框服务端在关闭连接之前发送的 SEQ = 301 报文,被网络延迟了。

  • 这时有相同端口的 TCP 连接被复用后,被延迟的 SEQ = 301 抵达了客户端,那么客户端是有可能正常接收这个过期的报文,这就会产生数据错乱等严重的问题。

 所以,TCP 就设计出了这么一个机制,经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。

原因二:保证连接正确关闭

假设 TIME-WAIT 没有等待时间或时间过短,断开连接会造成什么问题呢?

  • 如上图红色框框客户端四次挥手的最后一个 ACK 报文如果在网络中被丢失了,此时如果客户端 TIME-WAIT 过短或没有,则就直接进入了 CLOSE 状态了,那么服务端则会一直处在 LASE-ACK 状态。

  • 当客户端发起建立连接的 SYN 请求报文后,服务端会发送 RST 报文给客户端,连接建立的过程就会被终止。

 所以客户端在 TIME-WAIT 状态等待 2MSL 时间后,就可以保证双方的连接都可以正常的关闭。

七:如何理解HTTP协议是无状态的

当浏览器发送请求给服务器时,服务器响应了;如果同个浏览器发送第二个请求给服务器时,服务器还是会响应,但是服务器并不知道你是刚刚那个浏览器。

(HTTP一直无状态,但是应用为了有状态,就给HTTP加了cookie和session机制,让使用http的应用也能有状态,但http还是无状态)

八:从浏览器地址栏输出url到显示主页的过程

(1)DNS解析,查找域名对应的IP地址

(2)与服务器通过三次握手建立连接

(3)向服务器发送HTTP请求

(4)服务器处理请求,返回网页内容

(5)浏览器解析并渲染页面

(6)TCP四次挥手,连接结束

九:说下HTTP/1.0,1.1,2.0区别

HTTP1.0:默认使用短连接,每次请求都需要重新建议一次TCP连接。它可以设置Connection: keep-alive 这个字段,强制开启长连接。

HTTP1.1:(1)引用了持久连接,即TCP连接默认不关闭,可以被多个请求复用

                  (2)分块传输编码,服务端每产生一块数据,就发送一块,用“流模式”取代“缓存模                                 式”

                  (3)管道机制,即在一个TCP连接里,客户端可以同时发送多个请求。

HTTP2.0:(1)二进制协议,1.1版本的头信息是文本(ASCII编码),数据体可以是文本或者二                             进制;2.0中,头信息和数据体都是二进制。

                  (2)完全多路复用,在一个连接里,客户端和浏览器都可以同时发送多个请求或回                                 应,而且不用按照顺序一一对应。

                  (3)报头压缩,HTTP协议不带有状态,每次请求都必须附上所有信息。Http/2.0引入                             了头信息压缩机制,使用gzip或compress压缩后再发送。

                  (4)服务端推送,允许服务器未经请求,主动向客户端发送资源。

1.1,2.0区别

1 多路复用
       HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。

2 头部数据压缩
       在HTTP1.1中,HTTP请求和响应都是由状态行、请求/响应头部、消息主体三部分组成。一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输。随着Web功能越来越复杂,每个页面产生的请求数也越来越多,导致消耗在头部的流量越来越多,尤其是每次都要传输UserAgent、Cookie这类不会频繁变动的内容,完全是一种浪费。

       HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

3 服务器推送
       服务端推送是一种在客户端请求之前发送数据的机制。网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP1.1中这些资源每一个都必须明确地请求。这是一个很慢的过程。浏览器从获取HTML开始,然后在它解析和评估页面的时候,增量地获取更多的资源。因为服务器必须等待浏览器做每一个请求,网络经常是空闲的和未充分使用的。

       为了改善延迟,HTTP2.0引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前,免得客户端再次创建连接发送请求到服务器端获取。这样客户端可以直接从本地加载这些资源,不用再通过网络。

十. 在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?

这个问题记住keep-alive就好,也就是说,在HTTP中响应体的Connection字段指定为keep-alive即可

十一:HTTP和HTTPS的区别

HTTP即超文本传输协议,是一个基于TCP/IP通信协议来传输明文数据的协议。

HTTP会存在以下问题:

  • 请求信息是明文传输,容易被窃听截取。

  • 没有验证对方身份,存在被冒充的风险

  • 数据的完整性未校验,容易被中间人篡改

为了解决这些问题,HTTPS出现了

Https是什么?

HTTPS=HTTP +SSL/TLS可以理解Https是身披SSL(Secure Socket Layer,安全套接层)的HTTP。

区别如下:

什么是SSL?
SSL(Secure Socket Lay)位于TCP协议和各个应用层协议之间,为数据通讯提供安全支持。

SSL协议分为两层,SSL记录协议和SSL握手协议

SSL记录协议在TCP层之上,为高层协议提供数据封装,压缩,加密等;

SSL握手协议则是在SSL记录协议之上,用于在实际的用户数据开始传输之前,通讯双方之间进行身份确认,协商加密算法,交换密钥等。

十二(1):Http流程

HTTP的工作流程

第一步:建立TCP/IP连接,客户端与服务器通过Socket三次握手进行连接

第二步:客户端向服务端发起HTTP请求(例如:POST/login.html http/1.1)

第三步:客户端发送请求头信息,请求内容,最后会发送一空白行,标示客户端请求完毕

第四步:服务器做出应答,表示对于客户端请求的应答,例如:HTTP/1.1 200 OK

第五步:服务器向客户端发送应答头信息

第六步:服务器向客户端发送请求头信息后,也会发送一空白行,标示应答头信息发送完毕,接着就以Content-type要求的数据格式发送数据给客户端

第七步:服务端关闭TCP连接,如果服务器或者客户端增Connection:keep-alive就表示客户端与服务器端继续保存连接,在下次请求时可以继续使用这次的连接
 

十二(2):Https流程

(1)首先客户端向服务端发送Http请求,端口是443

(2)服务器必须要有一套数字证书(证书要有公钥,证书颁发机构,失效日期等),将自己的证书发送给客户端(公钥发送过去,私钥自己保存

(3)客户端拿到证书后,首先会验证它的合法性,如果证书通过,客户端会生成随机的对称秘钥,用数字证书的公钥加密,将加密后的秘钥发送给服务器

(4) 服务器用自己的私钥进行非对称解密,拿到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,酱紫传输的数据都是密文啦。

(5)客户端收到后,用自己的密钥对其进行对称解密,得到服务器返回的数据。

十三:说说HTTP的状态码,301和302的区别?

  • 301:(永久性转移)请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置。(永久重定向,会缓存

  • 302:(暂时性转移)服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。(临时重定向,不会缓存

十四:什么是数字签名,什么是数字证书?

  • 公钥和个人等信息,经过Hash摘要算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息摘要加密,形成数字签名

  • 公钥和个人信息、数字签名共同构成数字证书

十五:对称加密与非对称加密有什么区别

对称加密:指加密和解密使用同一密钥,优点是运算速度较快,缺点是如何安全将密钥传输给另                      一 方。常见的对称加密算法有:DES、AES等。

非对称加密:指的是加密和解密使用不同的密钥(即公钥和私钥)。公钥与私钥是成对存在的,                          如果用公钥对数据进行加密,只有对应的私钥才能解密。常见的非对称加密算法有                          RSA。

十六:如何设置长连接?

通过在头部(请求和响应头)设置Connection字段指定为keep-alive,HTTP/1.0协议支持,但是是默认关闭的,从HTTP/1.1以后,连接默认都是长连接。

十七:长连接在什么时候会超时呢?

  • HTTP一般会有httpd守护进程,里面可以设置keep-alive timeout,当tcp连接闲置超过这个时间就会关闭,也可以在HTTP的header里面设置超时时间

  • TCP 的keep-alive包含三个参数,支持在系统内核的net.ipv4里面设置;当 TCP 连接之后,闲置了tcp_keepalive_time,则会发生侦测包,如果没有收到对方的ACK,那么会每隔 tcp_keepalive_intvl再发一次,直到发送了tcp_keepalive_probes,就会丢弃该连接。

十八:说说DNS的解析过程?

DNS,英文全称是domain name system,域名解析系统,是Internet上作为域名和IP相互映射的一个分布式数据库。它的作用很明确,就是可以根据域名查出对应的IP地址。在浏览器缓存、本地DNS服务器、根域名服务器都是怎么查找的,大家回答的时候都可以说下哈。 

十九: 什么是DoS、DDoS、DRDoS攻击? 

DoS攻击(拒绝服务攻击):

使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致其用户无法正常访问

DDos攻击(分布式拒绝服务):

是指处于不同位置的多个攻击者同时向一个或几个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施Dos攻击

DRDoS: (分布式反射拒绝服务)

该方式靠的是发送大量带有被害者IP地址的数据包给攻击主机,然后攻击主机对IP地址源做出大量回应,从而形成拒绝服务攻击。

二十:什么是XSS攻击,如何避免?

跨站脚本攻击,它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS攻击一般分三种类型:存储型 、反射型 、DOM型XSS

解决方法:

  • 对输入进行过滤,过滤标签等,只允许合法值。

  • HTML转义

  • 对于链接跳转,如<a href="xxx" 等,要校验内容,禁止以script开头的非法链接。

  • 限制输入长度

二十一:聊聊SQL注入

SQL注入是一种代码注入技术,一般被应用于攻击web应用程序。它通过在web应用接口传入一些特殊参数字符,来欺骗应用服务器,执行恶意的SQL命令,以达到非法获取系统信息的目的。它目前是黑客对数据库进行攻击的最常用手段之一。

因为SQL是直接拼接的,如果我们完全信任前端传的参数的话。假如前端传这么一个参数时'' or '1'='1',SQL就变成酱紫的啦。

select * from staff where name='' or '1'='1';

这个SQL会把所有的员工信息全都查出来了,酱紫就请求用户已经越权啦。请求者可以获取所有员工的信息,信息已经暴露了啦。

二十二:Cookie和Session的区别

①Cookie可以存储在浏览器或者本地,Session只能存在服务器
②session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象
③Session比Cookie更具有安全性(Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
④Session占用服务器性能,Session过多,增加服务器压力
⑤单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的内存大小有关。
 

二十三:IP地址有哪些分类

IP地址=网络号+主机号

  1. 网络号:它标志主机所连接的网络地址表示属于互联网的哪一个网络。

  2. 主机号:它标志主机地址表示其属于该网络中的哪一台主机。

IP地址分为A,B,C,D,E五大类:

  • A类地址(1~126):以0开头,网络号占前8位,主机号占后面24位。

  • B类地址(128~191):以10开头,网络号占前16位,主机号占后面16位。

  • C类地址(192~223):以110开头,网络号占前24位,主机号占后面8位。

  • D类地址(224~239):以1110开头,保留位多播地址。

  • E类地址(240~255):以11110开头,保留位为将来使用

二十四:说一下ARP工作协议的过程

ARP 协议协议,Address Resolution Protocol,地址解析协议,它是用于实现IP地址到MAC地址的映射。

  1. 首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。

  2. 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己的ARP列表,是否存在该IP地址对应的MAC地址;如果有﹐就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求的数据包里,包括源主机的IP地址、硬件地址、以及目的主机的IP地址。

  3. 网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同,就会忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址。

  4. 源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

二十五:有了IP地址,为什么还要用MAC地址

MAC地址的诞生早于IP地址。在计算机设计之初,设备之间使用MAC地址互相确认身份,因为当时的网络拓扑并不大,我们完全可以让两台计算机之间两两互相发送数据,而随着网络的扩大,局域网规则已经不再适合了;

许多个类似上述的局域网组成一个大的互联网。它们彼此相连互相通信。

只拥有MAC地址的话,只有在同一网络区域内,才能进行数据传输,不能跨网络区域。

此时就需要IP地址确定对方网络(或设备)在互联网络中的位置,从而进行访问

  • 各个设备之间传递数据时,需要使用到MAC地址以确定对方的身份(场景:两个路由器之间跳转,局域网内主机通信)。
  • 各个网路之间通行需要使用到IP地址,主要是为了定位目的地址所在的位置,通过IP的分段机制推演出从源IP到目的IP的一条路径,而后数据包通过这条路径将数据送达。

二十六:TCP 和 UDP 分别对应的常见应用层协议有哪些? 

基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH

  • HTTP:HyperText Transfer Protocol(超文本传输协议),默认端口80

  • FTP: File Transfer Protocol (文件传输协议), 默认端口(20用于传输数据,21用于传输控制信息)

  • SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) ,默认端口25

  • TELNET: Teletype over the Network (网络电传), 默认端口23

  • SSH:Secure Shell(安全外壳协议),默认端口 22

基于UDP的应用层协议:DNS、TFTP、SNMP

  • DNS : Domain Name Service (域名服务),默认端口 53

  • TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口69

  • SNMP:Simple Network Management Protocol(简单网络管理协议),通过UDP端口161接收,只有Trap信息采用UDP端口162。

二十七:聊聊保活计时器作用 

除时间等待计时器外,TCP 还有一个保活计时器(keepalive timer)。设想这样的场景:客户已主动与服务器建立了TCP连接。但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。

二十八: URI和URL的区别

  • URI,全称是Uniform Resource Identifier),中文翻译是统一资源标志符,主要作用是唯一标识一个资源。

  • URL,全称是Uniform Resource Location),中文翻译是统一资源定位符,主要作用是提供资源

二十九:ICMP协议的功能

ICMP,Internet Control Message Protocol ,Internet控制消息协议。

  • ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。

  • 它是一个非常重要的协议,它对于网络安全具有极其重要的意义。ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。

  • 当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

比如我们日常使用得比较多的ping,就是基于ICMP的。

三十:Ping原理

ping,Packet Internet Groper,是一种因特网包探索器,用于测试网络连接量的程序。主要是向特定的目的主机发送ICMP(Internet Control Message Protocol 因特网报文控制协议) 请求报文,测试目的站是否可达及了解其有关状态

一般来说,ping可以用来检测网络通不通。它是基于ICMP协议工作的。假设机器A ping机器B,工作过程如下:

  1. ping通知系统,新建一个固定格式的ICMP请求数据包

  2. ICMP协议,将该数据包和目标机器B的IP地址打包,一起转交给IP协议层

  3. IP层协议将本机IP地址为源地址,机器B的IP地址为目标地址,加上一些其他的控制信息,构建一个IP数据包

  4. 先获取目标机器B的MAC地址。

  5. 数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址

  6. 机器B收到后,对比目标地址,和自己本机的MAC地址是否一致,符合就处理返回,不符合就丢弃。

  7. 根据目的主机返回的ICMP回送回答报文中的时间戳,从而计算出往返时间

  8. 最终显示结果有这几项:发送到目的主机的IP地址、发送 & 收到 & 丢失的分组数、往返时间的最小、最大& 平均值

三十一:TCP和UDP的区别

(1)TCP面向连接,而TCP是不面向连接的

(2)TCP提供可靠传输,TCP在传输数据之前,会有三次握手建立连接,而且在数据传递之时,

TCP会通过校验和,重传控制,序号表示,滑动窗口,确认应答来实现TCP的可靠传输

也就是说,通过TCP传输的数据无差错,不丢失,不重复。

远地主机在接收到UDP报文后,不需要给出任何确认,也不保证数据不丢失,是否能按时到达

 UDP尽最大努力交付,也就是说不保证可靠连接

(3)TCP只支持点对点通信,UDP支持一对一,一对多,多对一和多对多的交互通信

(4)TCP是面向字节流的,UDP是面向报文的

(5)TCP报文首部20个字节,而UDP只有8个字节

(6)TCP传输效率比UDP要低很多

三十一: 聊聊TCP的流量控制 

TCP三次握手,发送端和接收端进入到ESTABLISHED状态,它们即可以愉快地传输数据啦。

但是发送端不能疯狂地向接收端发送数据,因为接收端接收不过来的话,接收方只能把处理不过来的数据存在缓存区里。如果缓存区都满了,发送方还在疯狂发送数据的话,接收方只能把收到的数据包丢掉,这就浪费了网络资源啦。

TCP 提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流量控制

如何实现流量控制

主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。 

流量控制引发的死锁?怎么避免死锁的发生?
当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。

为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。
 

 三十二:TCP的拥塞控制

思路讲解: TCP拥塞机制也是个高频考点,需要掌握它跟流量控制的区别,也需要掌握拥塞控制的这几种算法:慢启动算法、拥塞避免、拥塞发生、快速恢复算法

拥塞控制是作用于网络的,防止过多的数据包注入到网络中,避免出现网络负载过大的情况。它的目标主要是最大化利用网络上瓶颈链路的带宽。它跟流量控制又有什么区别呢?流量控制是作用于接收者的,根据接收端的实际接收能力控制发送速度,防止分组丢失的。

慢开始

它表示TCP建立连接完成后,一开始不要发送大量的数据,而是先探测一下网络的拥塞程度。由小到大逐渐增加拥塞窗口的大小,如果没有出现丢包,每收到一个ACK,就将拥塞窗口cwnd大小就加1(单位是MSS)每轮次发送窗口增加一倍,呈指数增长,如果出现丢包,拥塞窗口就减半,进入拥塞避免阶段。

  • TCP连接完成,初始化cwnd = 1,表明可以传一个MSS单位大小的数据。

  • 每当收到一个ACK,cwnd就加一;

  • 每当过了一个RTT(往返时间),cwnd就增加一倍; 呈指数让升

◼ ssthresh(slow start threshold):慢 开始 阈值,cwnd达到阈值后,以线性方式增加
◼ 拥塞避免(加法增大):拥塞窗口缓慢增大,以防止网络过早出现拥塞
◼ 乘法减小:只要网络出现拥塞,把ssthresh减为拥塞峰值的一半,同时执行慢开始算法(cwnd又恢复到初始值)
 当网络出现频繁拥塞时,ssthresh值就下降的很快

快重传 

◼ 接收方
 每收到一个失序的分组后就立即发出重复确认
 使发送方及时知道有分组没有到达
 而不要等待自己发送数据时才进行确认
◼ 发送方
 只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段
 而不必继续等待重传计时器到期后再重传

快恢复


◼ 当发送方连续收到三个重复确认,说明网络出现拥塞
 就执行“乘法减小”算法,把ssthresh减为拥塞峰值的一半
◼ 与慢开始不同之处是现在不执行慢开始算法,即cwnd现在不恢复到初始值
 而是把cwnd值设置为新的ssthresh值(减小后的值)
 然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大

 

三十三 :说说TCP是如何确保可靠性的呢?

TCP使用一下方式保证自身发送接受数据可靠

1.数据包校验(16为数据校验和)防止发送过来的数据是错误数据

2.确认应答和序列号

3.超时重传,发送方发出数据后会启动一个定时器,超过该定时器时间依旧未收到对方确认,便会重新发送该数据

4.流量控制(16位窗口大小)确保接收方收到的数据在自身缓冲区中不会溢出

5.拥塞控制,保证数据在网络中传播的可靠性,降低丢包的概率,提高TCP的可靠性

三十四:Nagle 算法与延迟确认

Nagle算法

如果发送方疯狂地向接收方发送很小的数据包,比如一次就发送1个字节,那么显然会有问题。

TCP/IP协议中,无论发送多少数据,总是需要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

Nagle算法:任意时刻,最多只能有一个未被确认的小段。所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。

延迟确认

如果接受方刚接收到发送方的数据包,在很短很短的时间内,又接收到第二个包。那么请问接收方是一个一个地回复好点,还是合在一起回复好呢?

接收方收到数据包后,如果暂时没有数据要发给对端,它可以等一小段时间,再确认(Linux上默认是40ms)。如果这段时间刚好有数据要传给对端,ACK就随着数据传输,而不需要单独发送一次ACK。如果超过时间还没有数据要发送,也发送ACK,避免对端以为丢包。

但是有些场景不能用延迟确认,比如发现了乱序包接收到了大于一个 frame 的报文,且需要调整窗口大小等。

一般情况下,Nagle算法和延迟确认不能一起使用,Nagle算法意味着延迟发,延迟确认意味着延迟接收,酱紫就会造成更大的延迟,会产生性能问题。

三十五:302?403?401?

401:服务器端有些api接口要求传递token,token失效或没有传递,就会报401错误。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值