TCP三次握手(超详细)

1.TCP的定义和特性

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP协议的特性

  • 工作在传输层

  • 面向连接协议

  • 全双工协议:同时且双向传输

  • 半关闭:TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力

  • 错误检查

  • 将数据打包成段,排序

  • 确认机制

  • 数据恢复,重传:简单来说,就是下载暂停后还能继续下载

  • 流量控制,滑动窗口:一次传多少

2.TCP 数据段

TCP数据段由TCP头部+上层数据组成。

2.1TCP头部的内部结构

在这里插入图片描述
源端口号:属于客户端(发送请求),随机。
目标端口号:属于服务端(接收请求),一般固定。

序列号seq:表示本报文段所发送数据的第一个字节的编号,是随机的,可自设的。

确认号ack:(只有确认接收到了发送方发送的数据,才会有确认号)接收方在下一次传输中期望收到的序列号 (相当于接收方给传输方的暗号,)。

序列号和确认号 用于确保设备之间的通信

控制位

  • SYN(同步位): SYN=1 表示 设备一请求 和设备二 建立连接

  • ACK(确认位): ACK=1表示设备二确认和设备一建立连接

  • FIN(断开位): FIN=1 表示设备一和设备二断开连接

  • PSH(急切位): 0 就排队 1立刻传输

  • RST(重置位):RST=1 表示和主机之间的连接出现错误

  • URG(紧急位):表示本报文段中发送的数据是否包含紧急数据

3.TCP三次握手(非常重要)

TCP建立连接的过程称为三次握手。

3.1 为什么要三次握手

我们假设客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务端。本来这是一个早已失效的报文段。但服务端收到此失效的连接请求报文段后,就误认为是客户端再次发出的一个新的连接请求。于是就向客户端发出确认报文段,同意建立连接。

假设不采用“三次握手”,那么只要服务端发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务端的确认,也不会向服务端发送数据。但服务端却以为新的运输连接已经建立,并一直等待客户端发来数据。这样,服务端的很多资源就白白浪费掉了。

所以,采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,客户端不会向服务端的确认发出确认。服务端由于收不到确认,就知道客户端并没有要求建立连接。

3.2 具体过程详解

在这里插入图片描述
以上图为例,来详细讲解一下三次握手。(客户端----->服务端)

客户端和服务端为传输之前,都处于closed状态。

第一次握手:客户端向服务端发送SYN报文,请求和服务端建立连接。
发送完成后,客户端进入客户端进入SYN_SENT状态并且等待服务端的确认。

SYN报文中包含:

-随机序列号 以x举例 seq=x

-控制位 SYN(同步位)置为1 SYN=1

seq =x,SYN=1

第二次握手:服务端会持续监听(Listen),接收到客户端的请求后,根据SYN报文中的SYN=1 ,知道了客户端请求建立连接。

发送SYN+ACK报文,用于二次确认客户端的连接请求。
发送完成后,服务端进入SYN-RECEIVED 状态并等待客户端的回应。

SYN+ACK报文中包含:

-随机序列号 以y 举例 seq =y

-确认号(将客户端的序列号+1 设为自己的确认号) ack = x +1 //期望下一次收到序列号为x+1的数据 ,收不到不会同意建立连接。

-控制位 SYN =1 ACK=1 //表示同意建立新连接

SYN=1 ,ACK=1,seq=y ,ack =x+1

第三次握手:客户端收到服务端的再次确认请求后,确认请求,然后向服务端发送ACK报文,来二次确认想建立连接。

ACK报文中包含:

-序列号 服务端的确定号 seq=x+1

-确认号 ack= y +1 // 表示已经收到了服务端发送的报文 并将 服务端报文的序列号+1作为自己的确认号

-控制位 ACK(确认位) 置1 ACK=1 //表示确认服务端的确认请求。

seq= x+1, ack=y+1 ,ACK=1

三次握手后,客户端和服务端可以正常通信,客户端和服务端处于ESTABLISHED状态。

3.3 状态分析

closed状态:初始状态,表示TCP连接是“关闭着的”或“未打开的”
listen状态:监听状态,等待来自远方TCP端口的连接请求
SYN_SENT状态:表示客户端已发送SYN报文,等待服务端的确认
SYN-RECEIVED 状态:在收到和发送一个连接请求后,等待对方确认
ESTABLISHED状态表示TCP连接已经成功建立,服务端和客户端建立数据连接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白幽幽白

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值