系列文章目录
前言
随着网络编程的学习,发现很多知识点自己并没有掌握,所以需要不定期查漏补缺,温故而知新。提升自己的技能。
一、三次握手
1.第二次握手返回的ACK值不是预期值时会怎么处理?什么情况下会出现预期值不是期望值?
答:第二次握手返回的ACK值不是预期值时,握手发起方将发送RST报文给被动方,告知重新连接。
这种情况是可能出现的,比如网络拥堵的情况下,发起方发送了多条一次握手报文,且这些报文的SYN值不同,旧的握手报文先达到被动方,被动方发起第二次握手,那么返回的ACK值将不是发起方的预期值。
1.为什么不是二次握手?
答:如果是两次握手,那么会出现重复历史连接的初始化问题,会造成资源的浪费,无法可靠的同步双方的序列号。
如果因为网络拥堵情况,客户端向服务端发送了多次握手报文:
(1)假设服务器先收到旧握手报文,服务器认为连接建立,可以向客户端发送数据,客户端接收到数据后判断这不是自己的预期的连接,但服务器端已经完成了历史连接的初始化,这导致了资源的浪费。
(2)假设服务器收到了正确的握手报文,服务器端认为连接建立,向客户端发送第二次握手报文后等待客户端发送数据,但是此处客户端被关闭,未收到第二次握手报文,服务器端一直在等待,资源被占用,也导致了资源的浪费。
所以不能是两次握手。
2.为什么不是四次握手?
答:如果是四次握手,就是将三次握手中的第二次握手拆分成ACK,SYN两次报文发送,这样做会造成资源的浪费,即使同时发送也不会影响可靠性,所以可以合并到一个报文中发送。
3.第三次握手报文丢失,会出现什么情况?
答:若客户端发送的第三次握手报文没有被服务端接收到,服务端第二次报文发送超时时间已到则会重发第二次握手报文。一般报文会重发三次(这个次数可以通过变量设置),如果一直没有收到回复的第三次握手报文,服务器将会关闭这次的连接。
4.三次握手过程中客户端和服务端的状态变化?
答:发送方是客户端,被动接收方是服务端。
第一次报文发送前客户端是close状态,服务端是listen状态。
第一次报文发送后,客户端是syn_send状态。
第二次报文发送后,服务端是syn_rcvd状态。
第二次报文接收后,客户端是established状态。
第三次报文发送后,服务端接收到时,服务端也变为established状态。
握手建立完成。
二、四次挥手
1.四次挥手过程
待补充。
2.为什么要有TIME_WAIT?
待补充。
3.TIME_WAIT值为什么是2MSL,而不是其他值?
待补充。
二、IO复用
1.IO复用的是什么?
待补充
总结
记录网络编程学习中的一些知识点。