目录
61.客户端调用close()后的断开流程是怎样的?
62.没有accept可以建立TCP连接吗?
63.没有listen可以建立TCP连接吗?
64.什么是TCP半连接队列(SYN队列)和全连接队列(accept队列)?
65.TCP是怎样实现可靠传输的?
66.说说TCP的重传机制?
67.滑动窗口的大小由哪一方决定的?
68.接收窗口和发送窗口大小是相等的吗?
69.什么是流量控制?
70.SYN报文什么时候被丢弃?
71.客户端拔掉网线后,原本的TCP连接还存在吗?
72.HTTP-Keepalive和TCP Keepalive是一个东西吗?
73.TCP协议的缺陷?
74.服务端没有listen,客户端发起连接请求,会发生什么?
75.TCP四次挥手,可以变成三次挥手吗?
76.TCP序列号和确认号是如何变化的?
77.断网了还能ping通127.0.0.1(回环地址)吗?
78.127.0.0.1和localhost以及0.0.0.0有区别吗?
61.客户端调用close()后的断开流程是怎样的?
62.没有accept可以建立TCP连接吗?
可以。
accept系统调用并不参与三次握手过程,它的作用主要是将已经建立连接的socket取出来,然后对该socket进行读写操作。
63.没有listen可以建立TCP连接吗?
可以。
客户端可以进行TCP自连接(自己连接自己),也可以两个客户端同时向对方请求连接(TCP需同时打开)。这两种情况没有服务端参与,就不需要listen。
64.什么是TCP半连接队列(SYN队列)和全连接队列(accept队列)?
服务端收到客户端的SYN请求后,内核会将该连接放在半连接队列中,然后发送SYN-ACK报文给客户端,客户端回复ACK报文给服务端,服务端收到ACK后,会将该连接从半连接队列中移除,然后创建一个新的完全连接,并添加到accept队列中,进程调用accept函数时就会取出该连接。
半连接和全连接队列都有大小限制,如果超过限制,内核就会丢弃连接或者返回RST报文。
65.TCP是怎样实现可靠传输的?
TCP通过序列号、确认应答、超时重传、窗口控制等机制实现可靠传输。
66.说说TCP的重传机制?
1)超时重传:发送数据时会设定一个计数器,超过指定时间后没有收到对方的ACK应答,则会重发该数据。
2)快速重传:当连续收到三个相同的ACK报文时,就会在定时器过期之前,重传丢失的报文段。
3)SACK:在TCP首部字段的“选项”中添加SACK,它会将已收到的数据信息发送给发送方,发送方就可以只重传丢失的数据。
4)DSACK:用来告诉发送方,哪些数据被重复发送了。
67.滑动窗口的大小由哪一方决定的?
接收方的Windows字段。
68.接收窗口和发送窗口大小是相等的吗?
接收窗口大小约等于发送窗口大小。窗口大小并不是不变的。
69.什么是流量控制?
发送方根据接收方的实际接收能力来控制发送的数据数量。
70.SYN报文什么时候被丢弃?
TCP半连接队列满了、全连接队列满了。
71.客户端拔掉网线后,原本的TCP连接还存在吗?
情况1:拔掉网线后有数据传输:
如果服务端发送了数据,在服务端到达最大重传次数之前,客户端重新插回网线,那么原本的TCP连接正常存在;如果服务端达到了最大重传次数时,服务端就会断开连接。当客户端重新插回网线后,发送数据给服务端,服务端会回复RST报文,客户端收到后就会断开连接。
情况2:拔掉网线后没有数据传输:
如果双方都没有开启TCP保活机制,如果客户端的网线一直没有重新插回,那么客户端和服务端的TCP连接将会一直保持存在;如果双方都开启了TCP保活机制,客户端一直不插回网线,TCP保活机制就会探测对方的TCP连接没有存活,就会断开连接。而在TCP探测期间,客户端插回了网线,那么双方的TCP连接还能正常存在。
72.HTTP-Keepalive和TCP Keepalive是一个东西吗?
不是。
HTTP-Keepalive:也叫HTTP长连接,该功能由应用程序实现,可以使得同一个TCP连接来发送和接收多个HTTP请求/响应。
TCP Keepalive:也叫TCP保活机制,该功能由内核实现,当客户端与服务端长时间没有数据交互时,内核会发送探测报文来检查对方是否在线,来决定是否关闭TCP连接。
73.TCP协议的缺陷?
升级困难、建立连接的延迟、队头阻塞、网络迁移需要重新建立TCP连接。
74.服务端没有listen,客户端发起连接请求,会发生什么?
服务端如果只bind了ip和端口,没有调用listen,客户端发起连接请求,服务端会回RST报文。
75.TCP四次挥手,可以变成三次挥手吗?
当被动关闭方没有数据要发送,并且使用了TCP延迟确认机制,那么第二次挥手和第三次挥手可以合并传输,TCP可以变成三次挥手。
Tips:什么是TCP延迟确认机制?
1)有响应数据要发送时,ACK会随着响应数据一起发送给对方
2)没有响应数据要发送时,ACK将会延迟一段时间,以等待是否有响应数据一起发送
3)如果在延迟等待发送ACK期间,对方的第二个数据报文到达了,这时会立刻发送ACK
76.TCP序列号和确认号是如何变化的?
万能公式:
序列号 = 上一次发送的序列号 + len(数据长度)。特殊情况,如果上一次发送的报文是 SYN 报文或者 FIN 报文,则改为 上一次发送的序列号 + 1
确认号 = 上一次收到的报文中的序列号 + len(数据长度)。特殊情况,如果收到的是 SYN 报文或者 FIN 报文,则改为 上一次收到的报文中的序列号 + 1
77.断网了还能ping通127.0.0.1(回环地址)吗?
可以。
Tips:ping 127.0.0.1 和 ping 本机地址 没有区别。
78.127.0.0.1和localhost以及0.0.0.0有区别吗?
localhost不叫ip,它叫域名,默认解析为127.0.0.1;
ping 0.0.0.0 是会失败的,因为在IPV4中它表示是无效的目标地址。