当前位置:主页 > 查看内容

Linux:TCP协议——三次握手【图片+文字】

发布时间:2021-04-27 00:00| 位朋友查看

简介:LinuxTCP协议——三次握手【图片文字】 TCP协议 面向连接 三次握手 双方状态的转变 三次握手当中的包序管理 TCP协议 TCP协议 全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制。 TCP协议段格式 源/目的……

TCP协议

TCP协议:全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制。
TCP协议段格式
在这里插入图片描述
源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;(tcp是传输层的协议,端与端之间的数据传输,在TCP和UDP协议当中不会体现出IP)
32位序号: 消耗的是发送方维护的序号
32位确认号:告知消息的发送方期待发送方发送的下一条序号
16位窗口大小:告诉发送方字节的接收能力
4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60
6位标志位:

名称解释
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
SYN:请求建立连接; 我们把携带SYN标识的称为同步报文段
FIN:通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段

16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分,简单来说就是检验TCP数据是否在传输过程中失真。
16位紧急指针: 标识哪部分数据是紧急数据;
我们知道tcp协议有三个特征:面向连接、可靠传输和面向字节流接下来我们介绍TCP协议的时候,也是按照这个三个特征来介绍的。
40字节头部选项:MMS,最大报文长度,选项的最大字节数量是40字节 ;

面向连接

指tcp连接的本质是在建立三次握手时期,通信双方会协商很多连接当中的数据,例如:MSS,包序号等。
对于TCP而言,如果通信双方不建立连接则不能进行通信。

三次握手

从连接的建立和终止的角度,我们需要讨论三次握手以及四次挥手,这篇文章我们先来讨论一下三次握手,不过无论是三次握手还是四次挥手,我们在分析连接的时候,都是从双方的连接状态、连接数据包的名称和包序管理三个方面进行分析的。
三次握手
在这里插入图片描述
TCP数据包 = TCP协议包头部分 + 应用层递交给TCP协议的数据
注意:当发起连接或者断开连接的时候,调用connect函数,但是连接发送的syn,syn+ack,ack我们都没有直接参与,换句话说,在发送这些数据包的时候,我们并没有给传输层的TCP协议提交任何数据。这里的syn,syn+ack,ack全部都是TCP协议报头的内容。

双方状态的转变

服务

状态解释
CLOSED -> LISTEN]服务器端调用listen后进入LISTEN状态, 等待客户端连接;
LISTEN -> SYN_RCVD一旦监听到连接请求(同步报文段), 就将该连接放入内核等待队列中, 并向客户端发送SYN确认报文.
SYN_RCVD -> ESTABLISHED服务端一旦收到客户端的确认报文, 就进入ESTABLISHED状态, 可以进行读写数据了.

客户端

状态解释
CLOSED -> SYN_SENT客户端调用connect, 发送同步报文段;
SYN_SENT -> ESTABLISHEDconnect调用成功, 则进入ESTABLISHED状态, 开始读写数据

其实从个人角度上理解,我认为可以把UDP协议理解成我们平时寄信的行为,而TCP协议则和我们平时打电话类似,而三次握手就类似于通话双方在进行通话前要确保对方能够听到我们说话一样。
在这里插入图片描述

三次握手当中的包序管理

TCP将每个字节的数据都进行了编号. 即为序列号
在这里插入图片描述
每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 下一次你从哪里开始发。
TCP连接中维护了两套序号,一套是客户端在维护,一套是服务端在维护,两套序号相互独立,互不影响。其实这个过程就相当于是有两个人要交换各自的货物,然后每个货物都有自己编号,然后每次给对方发送的时候都会告诉对方自己是从几号货物开始发送的,自己希望下一次对方从记号货物开始给自己发送(表示在自己希望对方下一次发送的序号之前的货物都已经收到了),而只要自己不发送货物(数据)(纯ACK)货物对应的序号就不会改变(就不会消耗序号)。
在这里插入图片描述
总结:(1)三次握手当中,连接双方在协商各自维护的序号的起始位置SYN(seq=0)表示:
a.客户端想要和服务端建立连接
b.客户端告诉了服务端,自己维护的序号的起始位置是0
SYN + ACK(seq=0,ack=1)表示:
a.服务端告诉客户端想要和客户端建立连接
b.服务端告诉了客户端,自己维护的序号是从0号序号开始
c.服务端告诉客户端,期望客户端在发送下一条数据的时候,从客户端的1号序号开始发送
注意:这里的起始序号是通信双方在三次握手当中协商的,TCP连接的时候,双方维护的序号不一定是宋0号序号开始的,可以是任意的,但是后续的所有的数据包必须遵守该起始序号。
(2)纯ACK数据包不消耗序号
(3)如果带有应用层数据的TCP数据包,在该数据包中我们消耗的序号当中最大的序号是(seq+数据长度-1)
例如:PSH(seq=1):aaa[1,2,3],消耗的序号为:1+3-1 = 3
(4)回复确认信号的时候,需要告知消息发送方接下来发送数据的起始序号即:ACK = 发送方发送的数据当中的seq + len

;原文链接:https://blog.csdn.net/qq_43825377/article/details/115409527
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:C语言的一些“小细节“(1) 下一篇:没有了

推荐图文


随机推荐