安徽城乡建设局网站,游戏外包公司怎么接活,企业网络管理员,牡丹江建设局网站本篇总结的是计算机网络知识相关的面试题#xff0c;后续也会更新其他相关内容 文章目录1、TCP头部结构2、三次握手3、四次挥手4、为什么TCP连接的时候是三次#xff1f;两次是否可以#xff1f;5、为什么TCP连接的时候是三次#xff0c;关闭的时候却是四次#xff1f;6、… 本篇总结的是计算机网络知识相关的面试题后续也会更新其他相关内容 文章目录1、TCP头部结构2、三次握手3、四次挥手4、为什么TCP连接的时候是三次两次是否可以5、为什么TCP连接的时候是三次关闭的时候却是四次6、TIME_WAIT和CLOSE_WAIT的区别在哪?7、为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接8、如果已经建立了连接但是客户端突然出现故障了怎么办9、三次握手过程中可以携带数据吗10、各种状态的含义1、TCP头部结构
在介绍三次握手与四次挥手之前我们先来了解一下TCP的头部结构是什么样的。
TCP头部的最大长度为60字节其中包括TCP报文固定长度20字节可变字节(最大40字节)具体结构如下 在认识三次握手与四次挥手之前我们必须要直到以下字段及含义
序号seq占32位用来标识从发送端到接收端发送的字节流。确认号ack占32位只有ACK标志位为1时确认序号字段才有效ackseq1。标志位 SYN发起一个新连接。FIN释放一个连接。ACK确认序号有效。 在学习三次握手四次挥手后我们需要能流畅描述三次握手的流程及其中的字段含义作用的同时还需要记住每次握手时接收端和发送端的状态。 2、三次握手
在三次握手中发送端有CLOSED、SYN-SENT、ESTABLISHED三种状态接收端有CLOSED、LISTEN、SYN-RCVD、ESTABLISHED四种状态。
三次握手过程如下图 假设发送端为客户端接收端为服务端。开始时客户端和服务端的状态都是CLOSE。
第一次握手客户端向服务端发起建立连接请求客户端会随机生成一个起始序列号x客户端向服务端发送的字段中包含标志位SYN1序列号seqx。第一次握手前客户端的状态为CLOSE第一次握手后客户端的状态为SYN-SENT此时服务端的状态为LISTEN。第二次握手服务端在收到客户端发来的报文后会随机生成一个服务端的起始序列号y然后给客户端回复一段报文其中包括标志位SYN1ACK1序列号seqy确认号ackx1。第二次握手前服务端的状态为LISTEN第二次握手后服务端的状态为SYN-RCVD此时客户端的状态为 SYN-SENT。第三次握手客户端收到服务端发来的报文后会再向服务端发送报文其中包含标志位ACK1序列号seqx1确认号acky1。第三次握手前客户端的状态为SYN-SENT第三次握手后客户端和服务端的状态都为ESTABLISHED。 需要注意的一点是: 第一次握手客户端向服务端发起建立连接报文会占一个序列号。但是第三次握手同样是客户端向服务端发送报文这次却不占序列号.所以建立连接后客户端向服务端发送的第一个数据的序列号为x1。 3、四次挥手
客户端在四次挥手过程中有ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、TIME-WAIT、CLOSED等五个状态服务端有ESTABLISHED、CLOSE-WAIT、LAST-ACK、CLOSED等四种状态。
四次挥手过程如下图 假设客户端首先发起的断开连接请求
第一次挥手客户端向服务端发送的数据完成后向服务端发起释放连接报文报文包含标志位 FIN1序列号sequ。此时客户端只能接收数据不能向服务端发送数据。第二次挥手服务端收到客户端的释放连接报文后向客户端发送确认报文包含标志位ACK1序列号seqv确认号acku1。此时客户端到服务端的连接已经释放掉客户端不能像服务端发送数据服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。第三次挥手服务端发送完数据后向客户端发出连接释放报文报文包含标志位FIN1标志位ACK1序列号seqw确认号acku1。第四次挥手客户端收到服务端发送的释放连接请求向服务端发送确认报文包含标志位ACK1序列号sequ1确认号ackw1。
4、为什么TCP连接的时候是三次两次是否可以
答不可以主要从以下两方面考虑假设客户端是首先发起连接请求
假设建立TCP连接仅需要两次握手那么如果第二次握手时服务端返回给客户端的确认报文丢失了客户端这边认为服务端没有和他建立连接而服务端却以为已经和客户端建立了连接并且可能服务端已经开始向客户端发送数据但客户端并不会接收这些数据浪费了资源。如果是三次握手不会出现双方连接还未完全建立成功就开始发送数据的情况。如果服务端接收到了一个早已失效的来自客户端的连接请求报文会向客户端发送确认报文同意建立TCP连接。但因为客户端并不需要向服务端发送数据所以此次TCP连接没有意义并且浪费了资源。
5、为什么TCP连接的时候是三次关闭的时候却是四次
答因为需要确保通信双方都能通知对方释放连接。
假设客户端发送完数据向服务端发送释放连接请求当客户端并不知道服务端是否已经发送完数据所以此次断开的是客户端到服务端的单向连接。服务端返回给客户端确认报文后服务端还能继续单向给客户端发送数据。当服务端发送完数据后还需要向客户端发送释放连接请求。客户端返回确认报文TCP连接彻底关闭。
所以断开TCP连接需要客户端和服务端分别通知对方并分别收到确认报文一共需要四次。
6、TIME_WAIT和CLOSE_WAIT的区别在哪?
答默认客户端首先发起断开连接请求从上图可以看出
CLOSE_WAIT是被动关闭形成的当客户端发送FIN报文服务端返回ACK报文后进入CLOSE_WAIT。TIME_WAIT是主动关闭形成的当第四次挥手完成后客户端进入TIME_WAIT状态。
7、为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接
答其中MSL的意思是报文的最长寿命可以从两方面考虑
客户端发送第四次挥手中的报文后再经过2MSL可使本次TCP连接中的所有报文全部消失不会出现在下一个TCP连接中。考虑丢包问题如果第四挥手发送的报文在传输过程中丢失了那么服务端没收到确认ack报文就会重发第三次挥手的报文。如果客户端发送完第四次挥手的确认报文后直接关闭而这次报文又恰好丢失则会造成服务端无法正常关闭。 可靠的实现TCP全双工连接的终止 允许老的重复分节在网络中消逝。 8、如果已经建立了连接但是客户端突然出现故障了怎么办
答如果TCP连接已经建立在通信过程中客户端突然故障那么服务端不会一直等下去过一段时间就关闭连接了。具体原理是TCP有一个保活机制主要用在服务器端用于检测已建立TCP链接的客户端的状态防止因客户端崩溃或者客户端网络不可达而服务器端一直保持该TCP链接占用服务器端的大量资源(因为Linux系统中可以创建的总TCP链接数是有限制的)。 保活机制原理设置TCP保活机制的保活时间keepIdle即在TCP链接超过该时间没有任何数据交互时发送保活探测报文设置保活探测报文的发送时间间隔keepInterval设置保活探测报文的总发送次数keepCount。如果在keepCount次的保活探测报文均没有收到客户端的回应则服务器端即关闭与客户端的TCP连接。 9、三次握手过程中可以携带数据吗
答第三次握手的时候可以携带数据的第一次、第二次握手不可以携带数据。
假如第一次握手可以携带数据的话如果有人要恶意攻击服务器那他每次都在第一次握手中的 SYN 报文中放入大量的数据然后疯狂着重复发 SYN 报文的话这会让服务器花费很多时间、内存空间来接收这些报文。也就是说第一次握手不可以放数据其中一个简单的原因就是会让服务器更加容易受到攻击了。第一次、第二次握手都有SYN报文所以第一次、第二次握手都不可以携带数据。而对于第三次的话此时客户端已经处于 ESTABLISHED 状态。对于客户端来说他已经建立起连接了并且也已经知道服务器的接收、发送能力是正常的了所以能携带数据也没啥毛病。
10、各种状态的含义
CLOSED不在连接状态这是为方便描述假想的状态实际不存在LISTEN等待从任何远端TCP 和端口的连接请求。SYN_SENT发送完一个连接请求后等待一个匹配的连接请求。SYN_RCVD发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。ESTABLISHED表示一个打开的连接接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。FIN_WAIT_1等待远端TCP 的连接终止请求或者等待之前发送的连接终止请求的确认。CLOSE_WAIT等待本地用户的连接终止请求。FIN_WAIT_2等待远端TCP 的连接终止请求。LAST_ACK等待先前发送给远端TCP 的连接终止请求的确认包括它字节的连接终止请求的确认。CLOSING等待远端TCP 的连接终止请求确认。TIME_WAIT等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。