【TCP/IP】TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

1、基础知识

如下图所示,TCP报文由TCP首部+TCP数据部分组成,TCP报文加上IP首部,组成IP报文。TCP首部包含20个字节的固定部分和一些选项部分。固定部分主要由源宿端口/报文序列号/确认号/数据偏移/保留字节/标识位/窗口/校验和/紧急指针组成。

比较重要的概念是:

序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
确认标识位ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
同步标识位SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
终止标识位FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

2、三次握手

用户进程中调用系统函数connect()后便会发起三次握手。三次握手是client/server之间建立TCP连接过程。三次握手成功后,服务端便可以调用accept()函数,取出已经三次握手成功的TCP连接。其整体过程如下图所示:

3、四次挥手

四次握手是client/server之间断开TCP连接的过程。其实四次挥手过程既可以是client端发起,也可以是server端发起。现假设主动关闭方是client,client端的状态变化:established->fin-wait-1->fin-wait-2->time_wait->closed,server端的状态变化:established->close_wait->last_ack->closed。

4、三次握手和四次挥手常见问题

4.1 为何建立连接需要三次握手?

为什么不需要四次?

建立连接的时候,不需要四次握手,是因为server端在收到client发起TCP连接时的SYN报文后,server端可以一次性将ACK和SYN报文一次性发给client端。

为什么需要三次而不是两次?

还要再发送一次确认是为了,防止已失效的连接请求报文段突然又传到了B,因而产生错误。
已失效的报文段:正常情况下:A发出连接请求,但因为丢失了,故而不能收到B的确认。于是A重新发出请求,然后收到确认,建立连接,数据传输完毕后,释放连接,A发了2个,一个丢掉,一个到达,没有“已失效的报文段”。但是,某种情况下,A的第一个在某个节点滞留了,延误到达,本来这是一个早已失效的报文段,但是在A发送第二个,并且得到B的回应,建立了连接以后,这个报文段竟然到达了,于是B就认为,A又发送了一个新的请求,于是发送确认报文段,同意建立连接,假若没有三次的握手,那么这个连接就建立起来了(有一个请求和一个回应),此时,A收到B的确认,但A知道自己并没有发送建立连接的请求,因为不会理睬B的这个确认,于是呢,A也不会发送任何数据,而B呢却以为新的连接建立了起来,一直等待A发送数据给自己,此时B的资源就被白白浪费了。但是采用三次握手的话,A就不发送确认,那么B由于收不到确认,也就知道并没有要求建立连接。

4.2 为何关闭连接需要四次挥手?

被动关闭方(server)收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以被动关闭方(server)可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,被动关闭方ACK和FIN一般都会分开发送,从而导致多了一次。

4.3 四次挥手后,主动关闭方为何需要进入TIME_WAIT状态,继续等待2msl?

MSL指一个报文在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。正常情况下,主动关闭方发送了最后一个ack后,被动关闭方接收成功后会将自己的TCP连接设置为closed状态。如果异常的时候,主动关闭方的最后那个ACK没有发送到被动关闭方,会导致被动关闭方一直重复发送FIN报文。如果直到2MSL,主动关闭方(Client)都没有再次收到FIN,那么主动关闭方(Client)推断ACK已经被成功接收,则结束TCP连接(主动关闭方的最后一个ACK+被动关闭方的最后一个FIN报文的生存时间=2MSL)。另外一点,在两个传输方向上使尚未被接受或迟到的报文都消失。防止上一个连接的无效报文发给下一个连接。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bible_reader

如果觉得文章有用,欢迎打赏支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值