从零开始的计算机网络基础(图文并茂,1.8w字,面试复习必备) (6)

各占一个比特位。ACK比特用于指示字段中的值是有效的,RST,SYN和FIN用于建立和断开连接,URG用于标记报文段是否为“紧急”的数据,PSH被置1时,接收方应该立即将数据交给上传。(实践中,PSH,URG并没有使用)

紧急数据指针

指向紧急数据尾部的指针,与URG配合使用。(实践中并没有用到)

接收窗口

用于流量控制,之后会详细地讲解。

选项

通常为空,该字段用于发送方与接收方协商最大报文字段长度时,或在告诉网络环境下用作窗口调节因子时使用。

建立连接 三次握手

3

客户端发送一个syn=1连接请求和一个序列号seq=x,然后客户端进入syn_send状态,等待服务器的确认

服务器收到客户端的syn请求,需要对syn进行确认于是将ack=x+1,然后将序列号seq=y;最后将上述信息放到一个报文段中发送给客户端,服务器进入syn_receive状态

客户端收到服务端的确认信息,ack=y+1,seq=x+1,向服务端发送ack确认报文。该报文发送完毕后连接建立完成。

为什么要三次握手

主要是为了防止已经失效的请求报文段突然又传送到了服务端造成错误。举个例子,客户端向服务端发送的连接请求报文因网络原因超时,延期很久后到达服务端。服务端收到该连接请求认为是一次新的连接就像客户端发送连接确认请求,但因为该连接报文早已失效,客户端并不会响应服务端的确认信息。不过没有三次握手,服务端会认为连接已经完成,一直等待客户端发送数据,这样服务端的很多资源就浪费了。

SYN洪泛攻击:

SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

防范SYN攻击措施:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求。

四次挥手

4.png

客户端发送一个fin=1连接关闭的请求,序号seq=u,客户端的进入fin_wait_1状态

服务端收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),客户端进入fin_wait_2状态

服务端向客户端发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态(FIN=1,ACK=1,序号seq=w,确认号ack=u+1)

客户端收到服务端的fin报文,向客户端发送ack报文然后进入time_wait状态。服务端收到报文后关闭连接。客户端等待两个msl时间后关闭连接(ACK=1,seq=u+1,ack=w+1)

为什么四次挥手

因为tcp是全双工模式,当主机1发送fin报文表示主机1没有数据要发送了,主机2收到该报文发送一个ack确认报文表示我知道主机没有要发送的数据了,但主机1还可以接收报文,主机2发送一个fin到主机1,主机1收到后表示我知道主机2也没有数据要发送了。然后双方再愉快的分手

为什么等待2msl

保证tcp的全双工连接能正常关闭。如果客户端直接关闭,那么ack报文可能因为网络问题导致服务端没有收到客户端的ack确认请求。那么服务端会重新发送fin报文但此时客户端已经关闭该连接因此找不到与服务端对应的连接。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywwpy.html