TCP/IP经典问题总结

一、A进程经过TCP向另外一台机器上的B进程发送了一个字符串“hello”,TCP返回对方成功接收的确认信息,请问,如今进程A是否能够确定地说进程B收到了它发送的字符串?

答案:不能!举反例,进程B所在机器的TCP收到进程A发送的“hello”信息后,告诉进程A发送成功,但有可能没有当即将数据交给进程B,而是放在本身的缓冲区中,等待进程B读取,若是机器此时忽然掉电,缓冲区中的信息将丢失,进程B将不可能收到“hello”字符串。缓存

二、有什么办法来尽可能避免上述状况的发生呢?

答案:将TCP报文段首部中的PSH标志置1,这样会让B端的TCP协议收到数据后尽快交给进程B,能不缓存尽可能不要缓存。安全

三、咱们知道一般TCP链接的创建须要3次握手,关闭须要4次握手,为何关闭会多一次呢?

答案:简单说,就是TCP容许半关闭状态的存在。当进程A向进程B发送FIN,B也向A发送确认后。此时此刻的状态就是半关闭状态,A发送的FIN就是告诉B:“我要发送的数据都发送完了”但B没有发送FIN给A,有可能表明B还有没发送完的数据,若是B也发送完数据了,B就发送FIN给进程A,进程A确认B发送的FIN,这时,双方都已经发送完了数据,链接就断开了,TCP回收相关资源。服务器

四、假如服务器忽然掉电重启,但客户端并不知情,请问此时两者之间的TCP链接处于什么状态?

答案:处于半打开状态。就是客户端还以为链接是正常的,服务器这边已经没有链接的任何信息了。并发

五、那么,假如此时客户端经过这个链接向服务器请求数据,服务器会怎么应对呢?

答案:服务器收到客户端的请求会进行一次ARP查询,得到客户端MAC地址,然而因为已经丢失了全部链接信息,此时的服务器是一脸懵逼(就像喝了孟婆汤!),因而乎,它会发一个RST给客户端,表示:“哥们,我不认识你,想跟我说话请先发送SYN!”tcp

六、假如客户端按照服务器的要求从新创建链接,却搞错了服务器的端口号,会发生什么状况呢?

答案:有两种可能,一种是服务器端的TCP收到客户端请求,查看本机上是否有进程在监听相应的端口,若是有,就把请求交给这个进程,通常而言,这个进程不会接受这个链接的,因而它会发一个RST给客户端。还有一种多是TCP没有找到哪一个进程在监听相应的端口,因而TCP就会直接发一个RST给客户端,通常而言都会是这种状况。ide

七、假如如今有一个多进程服务器,服务器进程为A,接受一个链接后新建一个进程B来处理链接,再接受一个链接后又建一个进程C来处理这个链接,请问,进程ABC是否监听一样的端口?

答案:是!队列

八、那TCP接收到发送给这个端口的报文段,怎么决定发给哪一个进程呢?

答案:首先,全部的SYN报文段都会发送给服务器进程A,其余的报文段依据<sourceIP:port,targetIP:port>这个四元组来决定发送给进程B仍是进程C。进程

九、假如上面的服务器进程A收到一个链接请求,正在为这个请求建立处理进程的时候,又有新的链接请求进来了,TCP会怎么处理呢?

答案:通常状况下,服务器进程A会给TCP一个指示,让TCP维护一个适当长度的链接队列,TCP与新链接请求完成三次握手后,就会把这个链接放入链接队列中,服务器进程A会在合适的时候来从这个队列中取链接。ip

十、这个链接对列是否会对服务器的并发处理能力产生影响呢?若是会,会有什么影响?

答案:不会!两者没有必然关系。资源

十一、MSS和MTU各是什么,两者是什么关系?

答案:MSS是TCP最大报文段长度,就是TCP发送数据须要对数据分段时,最大的段的字节数。MTU是最大传输单元,一般由网卡的硬件特性规定,表示经过该网卡传输的数据单元最大的字节数。MSS要受同一台机器上的MTU限制。好比MTU为1500字节,那么MSS就只能是1460字节,这是由于1460字节的数据在经过网卡向外传输时,会加上20字节的ip头和20字节的tcp头。

十二、假设机器A和B的MSS分别是1400和1600,请问,A经过TCP向B发送数据时,是否能够发送长度为1600字节的数据段?

答案:不能够,虽然发送1600字节的数据段没有突破B的MSS,可是突破了A本身的MSS。这样一来,当这1600字节的数据段经过A的网卡向B发送时,会被切分为2个IP片,每一个为840字节,以保证不突破A的MTU,这显然下降了传输的效率,由于两个840字节中有着相同的IP头和TCP头。

1三、机器A和B有一条TCP链接,假如A想尽快断开链接,应当怎么办?

答案:A能够直接给B发送一个RST,就能够了,至关于告诉B,我关闭链接了,你看着办吧。这叫作异常关闭。

1四、B的TCP收到A发来的RST,会怎么办?

答案:B的TCP会告诉上层的进程,链接已经断开了,而后就会回收这条链接的资源,并不会发送任何确认信息给A。所谓你无情休怪我不义。

1五、假设A正常断开与B的TCP链接,当收到B的FIN时,A发送ACK给B,是否就算完成了4次握手,链接已经成功断开?

答案:不是,A的TCP会启动一个定时器,等待2MSL的时间,这主要是为了防止A的ACK没有成功传到B,让B觉得本身的FIN没有送到A处,反复重传FIN的问题。2MSL的时间到时,若是A没有再次收到B的FIN,说明B成功收到A的ACK,A就能够安全地断开这个链接,若期间再次收到B的FIN,则A会重传ACK。

相关文章
相关标签/搜索