[计算机网络] TCP 三次握手四次挥手

本文详细解析TCP连接的三次握手与四次挥手过程,包括握手的必要性和序列号初始化,以及SYN攻击和应对策略。此外,讨论了TIME_WAIT状态的意义和MSL的重要性。还介绍了Socket编程,包括connect、accept在握手过程中的位置以及close断开连接的四次挥手阶段。
摘要由CSDN通过智能技术生成

TCP 三次握手

三次握手的过程

在这里插入图片描述

0.最初,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN状态。
1.客户端会随机初始化序号( client_isn ),将此序号置于 TCP 首部的「序列号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
2.服务端接收 SYN 报文之后,首先也随机初始化一个自己的序号(server_isn),填入TCP 首部的 [序列号] 字段中,然后把 client_isn+1 填入 TCP 首部的 [确认应答号] 字段中,同时把 SYN 和 ACK 标志位设置为1,然后把该报文发给客户端。该报文也不包含应用层数据,之后服务端处于SYN-RCVD 状态。
3.客户端收到服务端报文之后,还要向服务端回应一个应答报文,TCP 首部的 [确认应答号] 填 server_isn+1,同时把 ACK 标志位设置为1,把报文发给服务端。这次报文可以携带客户端到服务器的数据,之后客户端处于 ESTABLISHED 状态。第三次握手是可以携带数据的,前两次握手是不可以携带数据的。
4.服务器收到客户端的应答报文之后,也进入 ESTABLISHED 状态。

为啥不是两次或四次

一、因为三次能够保证双方都有发送和接收的能力,具体来说:
1.避免历史连接的重复操作
由于网络阻塞,历史请求先到了,服务端回应的ACK的确认序列号是客户端SYN的client_isn序列号+1,客户端收到ACK发现与自己期望的请求(新的)的回应不符,于是发起 RST 报文终止连接。
2.避免浪费资源等待
客户端发现收到的ACK对应的序列号不是自己最近发送的,就会向服务端发送RST,服务端就会关闭这个请求的等待连接状态,否则会建立很多冗余的连接,占用服务端的连接队列资源。
3.确保双方同步更新序列号(序列号:不丢包,不冗余,按顺序)
三次握手确保了双方的初始序列号都被对方接收到了。 通信双方都应维护一个序列号(不止客户端向服务端发送数据,服务端也向客户端发送数据),只有同步了序列号才有可靠传输,这样接收方(对方)就可以按序接收,不丢包,不重复。TCP 许多特性都依赖于序列号实现,比如流量控制、丢包重传等,这也是三次握手中的报文称为 SYN 的原因,SYN 的全称就叫 Synchronize Sequence Numbers(同步序列号)。

二、服务端的回复ACK和 请求SYN可以合并在一步完成,不需要四次连接

三、如果是两次连接,那么服务端无从知道客户端是否收到了自己的ACK,所以每收到一个 SYN 就只能先主动建立一个连接。如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。

在这里插入图片描述
    在这里插入图片描述

为啥每次连接都初始化 SYN 序号

为了排除旧连接的历史报文:
每次建立连接之前,双方都初始化一个新的序列号,通信双方根据序号将不属于本次连接的请求报文丢弃掉。
(如果不加以区分,历史报文被新连接接收了,会产生数据错乱)

也为了安全性,防止黑客伪造相同序列号的 TCP 报文被对方接收

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值