TCP的3次握手与4次挥手

TCP的三次握手与四次挥手:

这里写图片描述
三次握手建立连接: 如上图(黑框)所示,在最初两端的TCP进程都处于CLOSED状态。host1主动打开连接,而host2被动打开连接

  • host2的TCP服务器进程优先创建传输控制块TCB,准备接受客户进程的连接请求,然后将自己的状态有COLSED改为LISTEN(收听)状态,等待客户的连接请求;host1的TCP客户进程也是创建传输控制块TCB,然后向B发出连接请求报文段,这是首部中的同部位SYN=1,这是host1的TCP客户进程进入SYN_SENT(同步已发送)状态。

  • host2收到连接请求报文段后,如同意连接,则向host1发送确认。在确认报文中把SYN位和ACK位都置1,这时host2的TCP服务器进程进入SYN_RCVD(同步收到)状态。

  • host1收到host2的确认后,还要向host2给出确认。确认报文段的ACK置1,这时,TCP连接已经建立,host1进入ESTABLISHED(已建立连接)状态。 当host2收到host1的确认后,也进入 ESTABLISHED状态。

四次挥手取消连接: 如上图中蓝色框的所示,在数据传输完毕后,host1和host2都处于ESTABLISHED状态,每个服务器都能发出释放链接的信号,我们在这以host1释放连接为例

  • host1的应用进程向其TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接,这时host1进入FIN_WAIT_1(终止等待1)状态,等待B的确认。

  • host2收到连接释放报文段后即发出确认,然后host2就进入CLOSE_WAIT(关闭等待)状态,TCP服务器进程这时通知高层应用进程,因此host1到host2这个方向的连接就释放了,这时的TCP连接处于半关闭状态,即host1已经没有数据要发送了,但是host2若发送数据,host1任然要接受,也就是说,从host2到host1这个方向的连接并未关闭,这个状态还要持续一些时间;当host1收到来自host2的确认后,就进入FIN_WAIt_2(终止等待2)状态,等待host2发出的连接释放报文段。

  • 若host2已经没有要向host1发送的数据,其应用进程就通知TCO释放连接,这时host2发出的连接为FIN=1,这时host2就进入了LAST_ACK(最后确认)状态,等待A的确认。

  • host1在收到host2的连接释放报文段后,必须对此发出确认,在报文段中把ACK置1,然后进入TIME_WAIT(时间等待)状态。现在TCP连接环没有释放掉,必须经过时间等待计时器设定的时间2MSL(最长报文段寿命)后,host1才能进入到CLOSED状态,当host1撤销相应的传输控制块TCB后,就结束这次的TCP连接。

三次握手四次挥手的相关问题 (全双工运行)

1、为什么是3次握手,两次可不可以

  1. 先假设两次握手可以,当host1向host2发送SYN请求,host2收到请求后,发送ACK和SYN给host1,此时两次握手结束,现在是host1成功连接到host2,但是host2连到host1的时候,并没有得到ACK信号,所以,当host2给host1发送数据的时候,就可能出现host1接受到数据了但是,host2并不知道,host2可能就会不停的按照超时重传来处理,这样就会是网络效率降低。
  2. 因为一些网络原因,已经失效的连接请求报文段(上一次的连接请求),而host1并没有像host2发出连接请求,但是host2确收到了一个连接请求,host2就会进入一个收发数据的状态(基于两次握手),造成资源的浪费,

2、为什么握手是3次,挥手是4次

这时因为服务端的LISTEN状态下的SOCKET当收到报文的建立连接请求后,它可以吧ACK和SYN(ACK起应答作用,SYN起同步作用)放在一个报文中来发送。但关闭连接的时候,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都发送给对方了,所以你可能未必会马上关闭SOCKET,也即你可能还需要发送一些数据给对方后,在发送FIN报文给对方来标识你同意现在可以关闭连接了,所以他这里的ACK报文和FIN报文多数情况下都是分开发送的。

3、host1在TIME_WAIT状态必须等待2MSL的时间

  1. 为了保证host1发送的最后一个ACK报文段能够到达host2。这个ACK报文段有可能对视,因而使处在LAST_ACK状态的host2收不到对已发送的FIN+ACK报文段的确认。host2就会超时重传这个FIN+ACK报文段,而host1就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着host1重传一次确认,重新启动2MSL计时器。最后,host1和host2都正常进入懂啊CLOSED状态。如果host1在TIME_WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么久无法收到host2重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,host2就无法按照正常步骤进入CLOSED状态。
  2. 在两次握手中出现的“已失效的连接请求报文段”出现在本链接中,host1在发送完最后一个ACK报文段后,在经过时间2MSL,就可以使本链接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现旧的连接请求报文段。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值