详解TCP中的三次握手和四次挥手

TCP的三次握手和四次挥手

TCP协议

这里写图片描述

  1. 源端口和目的端口

    各占2字节,分别写入源端口号和目的端口号。

  2. 序号

    占4字节,发送数据包中的第一个字节的序列号。

    TCP为面向字节流的,在TCP传送的数据流中,每一个字节都有一个序号。

  3. 确认号

    占4字节,期望收到对方下次发送的数据的第一个字节的序号。

    若确认号为N,说明1 - N-1全部接受完毕

  4. 首部长度(数据偏移)

    占4比特,表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。

  5. 控制位(标志位)

    一共6个,占6比特,设置为1时有效。按顺序依次为:URG、ACK、PSH、RST、SYN、FIN。

    标志位
    URG紧急位,为1时,首部中的紧急指针有效
    ACK确认位,为1时,首部中的确认号有效<规定:建立连接后所有的传输报文段都要把ACK置为1>
    PSH推送位,为1时, 接收方应该尽快将这个报文交给应用层
    RST复位标志,为1时, 重置连接
    SYN同步位,在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发回的报文段中使SYN=1和ACK=1
    FIN结束位,为1时,释放连接
  6. 窗口

    占2字节,表示报文段发送方期望接收的字节数

  7. 校验和

    校验和包含了伪首部、TCP首部和数据,校验和是TCP强制要求的,由发送方计算,接收方验证。

  8. 紧急指针

    URG标志为1时,紧急指针有效,表示数据需要优先处理。紧急指针指出在TCP段中的紧急数据的最后一个字节的序号,使接收方可以知道紧急数据共有多长。

三次握手

指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立

这里写图片描述

  1. 第一次握手

    client将同步位SYN置为1,选择一个初始序号seq = x,并将该报文发送给server,client进入SYN_SEND状态

    (TCP规定:SYN = 1的报文段不能携带数据,而且要消耗掉一个序号)

  2. 第二次握手

    server收到数据包后由标志位SYN=1知道client请求建立连接,server将标志位SYN和ACK都置为1,ack (number )=x+1,选择一个初始序号seq = y,并将该报文发送给client以确认连接请求,server进入SYN_RCVD状态

  3. 第三次握手

    client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确,则将标志位ACK置为1,ack=y+1,并将该报文发送给server,server检查ack是否为y+1,ACK是否为1,如果正确,则连接建立成功,client和server进入ESTABLISHED状态,完成三次握手,随后client与server之间可以开始传输数据了。

四次挥手

断开TCP连接时,需要客户端和服务端发送4个包以确认连接的断开。在socket编程中,这一过程可由客户端或服务端任何一方来触发。

TCP连接是全双工的,因此,每个方向都必须要单独进行关闭。

这里写图片描述

  1. 第一次挥手

    将FIN置为1,序号seq = u,它等于前面已传送过的数据的最后一个字节的序号加1,client进入FIN_WAIT_1状态;

    (TCP规定:FIN不携带数据,但是消耗一个序列号)

  2. 第二次挥手

    server收到连接释放报文段后即发出确认,确认号ack =u + 1,序号seq = v,server进入CLOSE_WAIT状态

    **client收到server的确认后,进入FIN_WAIT_2状态,**此时client→server方向的连接就释放了。

  3. 第三次挥手

    server已经没有数据要向client发送了,server发送连接释放报文段,关闭server→client的数据传送,此时server进入LAST_ACK状态

  4. 第四次挥手

    client收到连接释放报文后,对此发出确认,进入TIME_WAIT状态,等待2MSL后关闭连接。

Problem

  1. 为什么要使用三次握手

    为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误,主要目的防止server端一直等待,浪费资源。

    如果采用两次的话,会出现下面这种情况。

    解释1:比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。传完东西后,断开。结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。

    解释2:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。

  2. SYN攻击

    在三次握手过程中,server发送SYN_ACK报文之后,收到client的ACK之前的连接为半连接(half-open connect),此时server处于SYN_RCVD状态,当收到ACK后,server转入ESTABLISHED状态。

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

  3. 为什么使用四次挥手

    因为TCP是全双工模式

  4. 释放连接时,为什么在TIME_WAIT状态下等待2MSL?

    保证最后一个ACK报文段能到达服务端;

    (MSL,Maximum Segment Life,这是TCP 对TCP Segment 生存时间的限制)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值