11、为什么客户端的TIME-WAIT状态必须等待2MSL
主要有两个原因: 1、确保ACK报文能够到达服务端,从而使服务端正常关闭连接。 第四次挥手时,客户端第四次挥手的ACK报文不一定会到达服务端。服务端会超时重传FIN/ACK报文,此时如果客户端已经断开了连接,那么就无法响应服务端的二次请求,这样服务端迟迟收不到FIN/ACK报文的确认,就无法正常断开连接。 MSL是报文段在网络上存活的最长时间。客户端等待2MSL时间,即[客户端ACK报文1MSL超时+服务端FIN报文1MSL传输],就能收到服务端重传的FIN/ACK报文,然后客户端重传一次ACK报文,并重新启动2MSL计时器。如此保证服务端能够正常关闭。 如果服务端重发的FIN没有成功地在2MSL时间里传给客户端,服务端则会继续超时重试直至断开连接。 2、防止已失效地连接请求报文段出现在之后的连接中。 TCP要求在2MSL内不使用相同的序列号。客户端在发送完最后一个ACK报文段后,再经过时间2MSL,就可以保证本连接持续的时间内产生地所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。或者即使收到这些过时的报文,也可以不处理他。
12、如果已经建立了连接,但是客户端出现故障了怎么办?(或者说三次握手或者四次挥手阶段的包丢失了怎么办?)
简而言之,通过(定时器+超时重试机制),尝试获取确认,直到最后会自动断开连接。 具体而言,TCP设有一个保活计时器,服务器每收到一个客户端的数据,都会重新复位这个计时器,时间通常是设置为2h,若2h还没收到客户端的任何数据,服务器就开始重试:每隔75min发送一个探测报文段,若一连发送10个探测报文客户端依然没有回应,那么服务器就认为连接已经断开了。
13、TIME-WAIT状态过多会产生什么后果?怎么处理?
从服务器来讲,短时间关闭了大量的Client连接,就会造成服务器上出现大量的TIME_WAIT连接,严重消耗服务器的资源,此时部分客户端就会显示连接不上。 从客户端来讲,客户端TIME_WAIT过多,就会导致端口资源被占用,因为端口就65536个,被占满就会导致无法创建新的连接。 解决办法:
- 服务器可以设置SO_REUSEADDR套接字选项来避免TIME_WAIT状态,此套接字选项告诉内核,即使此端口正忙(处于TIME_WAIT状态),也请继续并重用它。
- 调整系统内核参数,修改/etc/sysctl.conf文件,即修改net.ipv4.tcp_tw_reuse和tcp_timestamps,net.ipv4.tcp_tw_reuse=1表示开启重用,允许将TIME_WAIT sockets重新用于新的TCP连接,net.ipv4.tcp_tw_recycle=1表示开启TCP连接中TIME_WAIT sockets的快速回收。
- 强制关闭,发送RST包越过TIME_WAIT状态,直接进入CLOSED状态。
14、TIME-WAIT是服务端状态还是客户端状态?
TIME-WAIT是主动断开连接的一方会进入的状态。一般情况下都是客户端所处的状态;服务器端一般设置不主动关闭连接。 TIME-WAIT需要等待2MSL,在大量短连接的情况下,TIME-WAIT会很多,这也会消耗很多系统资源。对于服务器来说,在HTTP协议指定KeepAlive(浏览器重用1个TCP连接来处理多个HTTP请求),由浏览器来主动断开连接,可以一定程度上减少服务器的这个问题。
15、TCP协议如何保证可靠性?
TCP主要提供了检验和、序列号/确认应答、超时重传、滑动窗口、拥塞控制和流量控制等方法实现了可靠性传输。
- 检验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送。
- 序列号/确认应答:序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。TCP传输过程中,每次接收方收到数据后,都会对传输方进行确认应答,即发送ACK报文,这个ACK报文中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发送。
- 超时重传:超时重传是指发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为是丢包了,需要重传。最大超时时间是动态计算的。
- 滑动窗口:滑动窗口既提高了报文传输效率,也避免了发送方发送过多的数据而导致接收方无法正常处理的异常。
- 拥塞控制:在数据传输过程中,可能由于网络状态的问题,造成网络拥堵,此时引入拥塞控制机制,在保证TCP可靠性的同时,提高性能。
- 流量控制:如果主机A一直向主机B发送数据,而不考虑主机B的接受能力,则可能导致主机B的接收缓冲区满了而无法在接受数据,从而会导致大量的数据丢包,引发重传机制。而在重传的过程中,若主机B的接收缓冲区情况仍未好转,则会将大量的时间浪费在重传数据上,降低传送数据的效率。所以引入流量控制机制,主机B通过告诉主机A自己接收缓冲区的大小,来使主机A控制发送的数据量。流量控制与TCP协议报头中的窗口大小有关。
16、详细描述TCP的滑动窗口。
在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP协议需要对数据进行确认后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。 为了避免这种情况,TCP引入了窗口概念。窗口大小指的是不需要等待应答确认包而可以继续发送数据包的最大值。 从上图可以看出,滑动窗口左边是已经发送并确认的分组,右边是还没轮到的分组。 滑动窗口里也分为两部分:一部分为已经发送但是未被确认的分组,一部分为窗口内要被立即发送的分组。随着已发送的部分被不断确认,窗口内等待发送的分组也会被不断发送。整个窗口就会往右移动,让还没轮到的分组进入窗口内。 可以看到滑动窗口起到了一个限流的作用,也就是说当前滑动窗口的大小决定了当前TCP发送包的速率,而滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的最小值。
17、详细讲一下拥塞控制
TCP一共使用了四种算法来实现拥塞控制:
- 慢开始(slow-start)
- 拥塞避免(congestion avoidance)
- 快速重传(fast retransmit)
- 快速恢复(fast recovery)
发送方维持一个叫拥塞窗口的状态变量(cwnd-congestion window),当cwndssthresh时,改用拥塞避免算法。
**慢开始:**不要一开始就发送大量数据,由小到大逐渐增加拥塞窗口大小。
**拥塞避免:**拥塞避免算法让窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1而不是加倍,这样拥塞窗口按线性规律缓慢增长。
**快重传:**我们可以剔除一些不必要的拥塞报文,提高网络吞吐量。比如接收方在收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时捎带确认。快重传规定:发送方只要一连收到3个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
**快恢复:**主要是为了配合快重传。当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半(为了预防网络发送拥塞),但并不执行慢开始算法,因为如果网络出现拥塞的话就不会收到好几个重复的确认,收到三个重复确认说明网络状况还可以。
18、HTTP常见的状态码有哪些?
常见状态码:
- 200:服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
- 301:(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。
- 302:(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
- 400:客户端请求有语法错误,不能被服务器所理解。
- 403:服务器收到请求,但是拒绝提供服务。
- 404:(未找到)服务器找不到请求的网页。
- 500:(服务器内部错误)服务器遇到错误,无法完成请求。
状态码开头代表类型:
开头序号 | 类别 | 原因短语 |
---|
1xx | Informational(信息状态码) | 接收的请求正在处理 | 2xx | Success(成功状态码) | 请求正常处理完毕 | 3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 | 4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 | 5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
19、状态码301和302的区别是什么?
共同点:301和302状态都表示重定向,就是说浏览器拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从相应的Location首部中获取(用户看到的效果就是输入的地址A瞬间变成了另一个地址B) 不同点:301表示旧地址A的资源已经被永久移除了(这个资源不可访问),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时的从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的地址。 补充:重定向原因: 1、网站调整(改变网页目录结构) 2、网页被移动到新地址 3、网页扩展名改变
20、HTTP常用的请求方式?
方法 | 作用 |
---|
GET | 获取资源 | POST | 传输实体主体 | PUT | 上传文件 | DELETE | 删除文件 | HEAD | 和GET方法类似,但只返回报文首部,不返回报文实体主体部分 | PATCH | 对资源进行部分修改 | OPTIONS | 查询指定的URL支持的方法 | CONNECT | 要求用隧道协议连接代理 | TRACE | 服务器会将通信路径返回给客户端 |
为了方便记忆,可以将PUT、DELETE、POST、GET、GET理解为客户端对服务端的增删改查。
- PUT:上传文件,向服务器添加数据,可以看作增
- DELETE:删除文件
- POST:传输数据,向服务器提交数据,对服务器进行更新
- GET:获取资源,查询服务器资源
参考链接:同上。
|