TCP三次握手

tcp协议头

在这里插入图片描述

16位源端口号:报文的发送发送方的进程端口值
16位目的端口号:报文接收方的进程端口值
32位序号

  • 建立连接阶段:随机生成的序列号
  • 通信阶段:tcp报文中第一个数据在字节流中的编号

32位确认号

  • 建立连接阶段:向对方发送确认报文时,“请求报文的序列号+1”=确认号
  • 通信阶段:tcp报文中期待下一个数据包的首个字节在字节流的编号

4位头部长度:用来表示报文首部的长度。
6位保留字段:作为保留字段,暂时没什么用处
标志位

  • URG: 紧急位
  • ACk: 确认位
  • PSH: 发送位
  • RST: 重置位
  • SYN: 请求连接
  • FIN: 结束连接

16位窗口大小:TCP通过滑动窗口的概念来进行流量控制。由于窗口由16bit定义,所以可以提供的最大缓冲区为65535。

  • 如果发送方接收到接收方的滑动窗口大小为0,则发送方停止发送,知道接收方发来滑动窗口非0的报文

16位校验和

  • 计算方法:TCP校验字段占两个字节如0x62,0x0d,实际上是这样计算来的:
    DIP+SIP+报文长度+信息长度+0x06(协议类型)+
    TCP各字段长度以及数据各字段和(注意此时将对应的校验和字段–TCP的第17,18位,实际对应数组下标的16,17位–都设为0x00.同时
    每两个字节组合为一个数值如0x01,0x02组合为0x0102,数据abc对应为0x61,0x62,0x63,则组合成0x6162,0x6300)
    上述算出来的校验和(设为resule)假如超过0xffff的话,将超过的部分添加到result的低位去再用0xffff减去该值,如:0x54321最终应成为:0xffff-(0x4321+0x05)

  • 目的:为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到检验和有差错,则TCP段会被直接丢弃。

16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。
协议的实现为了提高效率,往往在应用层传来少量的数据时不马上发送,而是等到数据缓冲区里有了一定量的数据时才一起发送,但有些应用本身数据量并不多,而且需要马上发送,这时,就用紧急指针,这样数据就会马上发送,而不需等待有大量的数据。

三次握手

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。

图解三次握手
第一次握手的标志位
我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)
在这里插入图片描述
第二次握手的标志位
我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN + ACK)
在这里插入图片描述
第三次握手的标志位
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)
在这里插入图片描述

四次挥手

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)
在这里插入图片描述
对三次握手与四次挥手解释的很详细的博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值