TCP三次握手详解

1.TCP报文格式 :TCP报文是TCP层所传输的数据单元,又称报文段。

 TCP报文字段如左图所示

1.1什么是序列号?(Sequence number)

占32位。表示的是发送方,这个packet的数据部分的第一位应该在整个data stream中所在的位置。因为对于没有数据的传输,如ACK,虽然它有一个seq,但是这次传输在整个data stream中是不占位置的。所以下一个实际有数据的传输,会依旧从上一次发送ACK的数据包的seq开始)

1.2什么是确认号?(Acknowledge number)

占32位。表示的是接收方的下一次sequence number是多少,一旦连接建立成功,ACK值一直为1。

1.3源端口(Source Port)与目的端口(Destination Port)字段

1)源端口:占16位。源计算机上的应用程序的端口号。

2)目的端口:占16位。目标计算机的应用程序端口。

1.4数据偏移字段

TCP首部长度(Header Length):占4位。数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量,其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。

1.5保留字段

保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。
1.6标志位字段

Nonce (ECN-Nonce):使发送方能够验证 ECN 接收器并且没有其他干扰在信令路径中隐藏标记(或丢弃)的数据包。ECN- Nonce 可以防止实现错误和故意虐待。
CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。- SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
1.7窗口大小字段

窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。
TCP 校验和字段

1.8校验位(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。
1.9紧急指针字段

紧急指针(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。
1.10可选项字段
选项(Option):长度不定,但长度必须是 32bits 的整数倍。

2.TCP三次握手

在建立TCP连接时,客户端与服务端一共要发出3个包。客户端与服务端之间要确认对方是否具有收到与发出的能力。

第一次握手:客户端发出连接请求,服务端收到连接请求,至此,服务端知道客户端有发送能力。
第二次握手:服务端收到第一次客户端发出的连接请求后,向其发出收到连接请求的响应和连接请求,至此,客户端知道服务端有发送能力和接收能力。
第三次握手:客户端收到服务端对它第一次所请求的回应后,发送收到连接请求的响应,服务端收到后,至此,服务端知道客户端有接收能力。

3.常见问题:

为什么是三次握手而不是两次?

两次握手使客户端能够确认服务端的接收与发送正常,但服务端不能确认客户端的发送能力是否正常,所有需要第三次握手来证明,以确保TCP的连接可靠。

                                                                                           

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值