网络原理:三次握手和四次挥手中的一些问题

一、说说三次握手的过程
在这里插入图片描述
第一次握手:客户端主动去连接服务器,并发送SYN=1,请求报文段不能携带数据,但要消耗一个。随机产生一个序列号,假设序列号是x,服务端被动打开,客户端进入SYN-SENT(同步已发送)状态
第二次握手:服务器在收到SYN后,将同步位SYN和确认位ACK都置为1,确认序号为ack=x+1,ack的系列号是x+1表示是给seq =x的应答。自己再随机产生一个序号seq=y,连接接收报文也不能携带数据消耗一个序号,这时服务器进入SYN-RCVD(同步接收状态)
第三次握手:客户端在收到新seq=y,ack= x+1后,也回应ack= y+1表示收到了。这时TCP已建立连接,客户端进入BSTABLISHED(已建立连接状态),服务器收到客户端发送来的确认报文之后也进入BSTABLISHED状态。
三次握手确认之后两边就可以通信了。

二、为什么是三次握手,两次行不行?
假如不进行第三次握手,在服务端对客户端的请求报文回应后,就会理所当然的认为连接已经建立,并保存了必要的资源,但是可能由于网络的原因或者其他原因客户端没有收到服务端的回应,那么客户端依然认为连接没有建立,所以并不会响应服务端的确认消息,那么服务端就会一直等待,如果这种情况大量发生,会造成服务器的崩溃。

三、为什么不是四次握手?
因为三次握手之后,客户端和服务端至少可以确认之前的通信情况,而丢包或者丢失ACK是没有办法避免的,所以无法预知之后的情况,那么就算有五次,六次,七次握手都是徒劳的。

四、什么是ISN?
ISN,是发送方的字节数据的起点,TCP为每一个字节都编上序号,即序列号,将数据与其他数据区分开。
它的作用是让对方产生一个合法接收窗口,ISN并不是固定的,而是随机变换的,这样可以增加安全性,为了避免被第三方猜测到,从而伪造报文,一旦接收方收到了伪造的报文,就不会去理会发送方发送的报文,只会认为这是一个重复的报文而被过滤掉。
ISN动态随机的好处使得每个TCP session的字节序列号不会重叠,如果出现TCP五元组冲突这种极小概率的发生,一个session也不会被误认为是另一个session。

五、第一次握手可以携带数据吗?
不可以,因为三次握手还没有完成。
如果第一次握手就可以携带数据,由于服务器没有进入确认连接状态,就不会将这些数据提交给应用层程序,那么服务端就需要开辟缓存空间来容纳这些数据,这样会造成SYN FLOOD攻击,攻击者可以制造成千上万的请求报文,并携带大量数据,那么服务器的内存很快就会耗尽从而拒绝服务。

六、第三次可以携带数据吗?
可以,能发出第三次握手报文的一定能接受到第二次握手报文,由于ISN没办法猜到,第三方主机是不会收到第二次握手报文的,能发出第三次握手的一定是合法的用户,在保证了这样的安全的条件下,服务器在收到了第三次确认之后,就会立即切换为BSTABLISHED状态,就可以去处理报文中的数据。

七、说说四次挥手的过程
在这里插入图片描述
第一次挥手:客户端进程向服务端发出连接断开请求的报文,并且停止发送数据。A将连接释放的报文FIN=1,其序列号seq=u,u=前面已经传送过来的报文序列号+1,此时客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定FIN报文即使不携带报文,也要消耗一个序列号。
第二次挥手:服务端收到连接报文后发出确认,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时服务器端入
CLOSE-WAIT(关闭等待)状态。TCP服务器通知上一层应用层的进程,客户端向服务端的连接已经释放了,这是服务端处于半关闭状态,已经没有数据发送了,所以客户端停止发送数据,但是服务器若发送数据,客户端依然要接受,这个状态要持续一段时间,即使CLOSE-WAIT所要持续的时间。
客户端收到服务器的请求后,就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,在此之前还要接受服务器发送最后的数据。
第三次挥手:服务器将最后的数据发送完毕之后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于处于半关闭状态 ,服务器很可能又发送了一些数据,假设此时的序列号是seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态。等待客户端的确认。
第四次挥手:客户端在收到服务器的连接释放报文之后,必须向服务器发送确认报文,ACK=1,ack=w+1,自己的序列号是seq=u+1。此时客户端就进入TIME-WAIT(时间等待)状态。此时客户端还没有连接释放,必须经过2MSL的时间后(2MSL是最长报文段寿命)客户端才进入CLOSED状态。
服务器在收到客户端发来的确认后,立即进入CLOSED状态。
完成以上的四次挥手后,两边才最终连接断开。

八、为什么建立连接是三次握手,释放连接却是四次挥手
因为在连接时,服务器收到客户端SYN连接请求,可以把SYN和ACK放在一个报文里发送,可以用SYN=1,ACK=0来标识一个连接请求,而在关闭连接时,客户端处理完最后的数据之后,就发送FIN报文告诉服务端自己要断开连接了将不再发送数据了,但是可以接受数据,而此时服务器可能还没有将全部的数据发送给客户端,所以服务器可以立即关闭,也可以将最后的数据发送给客户端,再发送FIN报文给客户端同意释放连接,然后再等待客户端的回复,由于一般FIN报文会与ACK报文分开发送,从而导致了多了一次。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值