网络协议之TCP协议

定义

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的可靠的基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。

报文结构

TCP

报文中阴影部分需要注意一下(TCP建立连接和断开连接的关键参数):

  1. 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
  2. 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
  3. 标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
    URG:紧急指针(urgent pointer)有效。
    ACK:确认序号有效。
    PSH:接收方应该尽快将这个报文交给应用层。
    RST:重置连接。
    SYN:建立一个新连接。
    FIN:断开一个连接。

TCP建立连接之三次握手

在这里插入图片描述
三次握手形象比喻:
Client:你好,我们建立连接吧。
Server:好的,这边准备好了。
Client:我也准备好了。

具体过程如下:

  1. 当客户端调用 connect() 函数后,TCP协议会组建一个数据包,并设置 SYN 标志位,表示该数据包是用来建立同步连接的。同时生成一个随机数字 1000,填充“序号(Seq)”字段,表示该数据包的序号。完成这些工作,开始向服务器端发送数据包,客户端就进入了SYN-SEND状态。
  2. 服务器端收到数据包,检测到已经设置了 SYN 标志位,就知道这是客户端发来的建立连接的“请求包”。服务器端也会组建一个数据包,并设置 SYNACK 标志位,SYN 表示该数据包用来建立连接,ACK 用来确认收到了刚才客户端发送的数据包。
    服务器生成一个随机数 2000,填充“序号(Seq)”字段。2000 和客户端数据包没有关系。
    服务器将客户端数据包序号(1000)加1,得到1001,并用这个数字填充“确认号(Ack)”字段。
    服务器将数据包发出,进入SYN-RECV状态。
  3. 客户端收到数据包,检测到已经设置了 SYNACK 标志位,就知道这是服务器发来的“确认包”。客户端会检测“确认号(Ack)”字段,看它的值是否为 1000+1,如果是就说明连接建立成功。
    接下来,客户端会继续组建数据包,并设置 ACK 标志位,表示客户端正确接收了服务器发来的“确认包”。同时,将刚才服务器发来的数据包序号(2000)加1,得到 2001,并用这个数字来填充“确认号(Ack)”字段。
    客户端将数据包发出,进入ESTABLISED状态,表示连接已经成功建立。
  4. 服务器端收到数据包,检测到已经设置了 ACK 标志位,就知道这是客户端发来的“确认包”。服务器会检测“确认号(Ack)”字段,看它的值是否为 2000+1,如果是就说明连接建立成功,服务器进入ESTABLISED状态。

TCP数据传输过程

在这里插入图片描述
传输过程中仍是有来有往的,发出请求后一定确认的应答,同时确保没有丢包。
ACK号、SEQ号满足以下关系:
Ack号 = Seq号 + 传递的字节数 + 1

TCP断开连接之四次挥手

在这里插入图片描述
四次挥手形象比喻:
Client:任务完成了,我们断开连接吧。
Server:好的,我准备一下。
Wait…
Server:我准备好了,可以断了。
Client:好的,我断了,谢谢。

具体过程如下:

  1. 客户端调用 close() 函数后,向服务器发送 FIN 数据包,进入FIN_WAIT_1状态。FIN 是 Finish 的缩写,表示完成任务需要断开连接。
  2. 服务器收到数据包后,检测到设置了 FIN 标志位,知道要断开连接,于是向客户端发送ACK“确认包”,进入CLOSE_WAIT状态。
  3. 客户端收到ACK“确认包”后进入FIN_WAIT_2状态,等待服务器准备完毕后再次发送数据包。
  4. 等待片刻后,服务器准备完毕,可以断开连接,于是再主动向客户端发送 FIN 包,告诉它我准备好了,断开连接吧。然后进入LAST_ACK状态。
  5. 客户端收到服务器的 FIN 包后,再向服务器发送 ACK 包,告诉它你断开连接吧。然后进入TIME_WAIT状态。
  6. 服务器收到客户端的 ACK 包后,就断开连接,关闭套接字,进入CLOSED状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

火山宝 && 王林宝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值