积分商城网站开发,住房与住房建设部网站,单页面网站源码,如何做市场营销推广文章目录 温习序号的意义序号和确认序号报文的类型 TCP报头类型详解ACK: 确认号是否有效SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段FIN: 通知对方, 本端要关闭了PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带RST标识的称… 文章目录 温习序号的意义序号和确认序号报文的类型 TCP报头类型详解ACK: 确认号是否有效SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段FIN: 通知对方, 本端要关闭了PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段URG: 紧急指针是否有效 本篇继续对于TCP协议的字段进行解析 温习
序号的意义
TCP为了传输的效率必然会遇到批量化传输这样的场景那也就意味着会涉及到批量化的应答
这里随之而来会遇到一个问题那就是在传输的过程中由于传输的速度不同所以曾经发送的数据不一定是对方接收的顺序所以一定要在传输之后的内容带一个对应的序号那么这个序号实际上就是客户端给服务端发送时候报文的序号也正是因为有这个序号所以才能对收到的报文进行排序保证数据的按序到达
序号和确认序号
那序号和确认序号就是伴随着上面的概念而引出的当传输过去了之后对应着传输回来的ACK序号往往是收到的报文序号加一采用这样的方式就能对于对应的报文当中的内容进行确认了
报文的类型
在上篇的最后我们讲到对于一个服务器来说它必然会产生很多的请求有些请求是要建立链接的有些是要断开连接的有些是要进行正常通信的所以我们说报文是有类型的所以我们才知道对于TCP中的报头部分其当中会有很多的标记位其中有几个标记位就是来区分不同的报文类型的这也是说明了在上面的场景中可以突出他们需要标记位的原因所以本节要总结的核心点就是对于报文的类型进行解析
对于TCP的三次握手和四次挥手在后面的文章中也会进行详细的总结和解析
TCP报头类型详解
ACK: 确认号是否有效
首先第一个标记位是ACK标记位这个标记位的作用是确认序号是否有效实际上在进行数据通信的时候在三次握手建立成功之后在大部分情况下所有报文的ACK标记位默认都是被置一的它的意思就是说这个标记位是有效的ACK原则上代表的是报文是具有应答属性的而在进行报文通信的时候很多是有捎带应答的概念所以在一个报文给对方进行应答的同时可能携带了我的数据那么如何判断这是一个简单的应答还是有其他的数据一个是要看这个ACK标记位是否有内容一个就是要看有效载荷当中是否有数据
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
SYN的全称是synchronous翻译过来的意思是同步那它代表的是什么意思呢给出下面的这个场景
假设现在通信双方要进行一个简单的通信那么此时第一步要做的就是先建立链接可是服务器是如何知道我当前要和它做的事是建立链接呢所以说在一个报文中凡是设置了SYN标记位的报文实际上都是代表了自己想要和服务器进行三次握手建立链接这个也叫做是建立链接的请求所以它用来标识发过来的TCP整体的报文是一个链接的请求
FIN: 通知对方, 本端要关闭了
第三个要说的标记位是FIN其全称是finish这个其实很好理解它表示的意思就是说通信双方要使用的这个TCP将要关闭了所以要进行断开链接了
所以由此可以看出标记位当中不仅有要进行数据通信的标记位也有对应的控制标记位表示我当前要建立链接或者是当前要退出链接
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
首先说明TCP报头和配套的协议都是操作系统自主决定的通常来说它不会允许用户直接从外部去修改对应的比特位信息通常最多是提供一些系统调用来进行修改实际上在进行套接字的设置过程中当进行发起connect的请求的时候实际上就是TCP报文要在底层把SYN设置为一然后发送给服务器要进行三次握手的链接过程而这个FIN表示的就是在进套接字关闭的时候要进行的close的操作实际上也是在底层把这个FIN标记位设置为一
那回到PSH标记位在进行TCP通信的时候在客户端向服务端发消息服务端向客户端发消息由于存在流量控制的原因所以对应的应用层可能会出现迟迟不把数据取走的情况出现那么就会导致缓冲区的数据越来越多最终导致空间越来越小不过以我们前面的代码来看出现这样事件的情况并不多见而如果真的出现这样的情况会怎么样呢如果此时现在已经陷入了循环客户端要给服务端发消息服务端缓冲区已经满了而客户端不知道什么时候缓冲区有内容那这样的情况该如何解决呢
对应的策略提供两种
发送方会定期的询问对方看对方的缓冲区中还有没有空间只要有就能发送报文但是前提是对方肯定要做出应答当接收方的缓冲区数据被上层更新了之后它就会给对方发送一个报文说自己的缓冲区已经更新了可以在缓冲区中继续写入数据了
这两种协商方式在实际的TCP协议中是会同时存在的具体哪一种协议方式生效就使用哪一种但不管怎么说假设现在对方缓冲区的数据就是不拿走就在对应的缓冲区中卡着那么此时对应的TCP该如何处理呢所以就用到了这个PSH标记位这个标记位表示的是push的意思表示的是如果对方的操作系统中收到了代表着PSH标记位的数据时就表示这个操作系统必须要赶快把缓冲区当中的信息交付到上层空间中尽快的腾出空间当有这样的需求的时候发送放就会把信息读走如果迟迟不读可能会直接把建立的链接关闭等等所以换句话说其实PSH的作用就是催促对方赶快读走信息
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
下一个要说的是RST标记位正常情况下TCP的三次握手和四次挥手是应该成功的但是这样的动作有没有可能出现意外呢答案也是可能的
在TCP的内部可能会和很多个客户端建立链接那么在TCP的内部必然会存在对应的数据结构用来描述这样的链接情况所以从本质上来说就可以把对于TCP链接的管理转换为对于链表的增删查改所以说对于客户端和服务端来说一定要在内核中维护对应的结构和对象上面讲的什么缓冲区超时重传序号问题这些属性的字段都会在对应的结构体当中进行标识
可是问题是对于链接的维护是有成本的维护的成本主要体现在三次握手成功之后此时就会建立链接创建对应的结构体数据结构然后进行维护对应的链接情况但是不管怎么说如果出现链接异常的情况呢客户端认为链接成功了而实服务端没有成功那么在进行报文传输的时候就会携带有对应的RST标记位表示现在应该要建立链接了
那对于客户端来说它在发送了最后一个信息的时候就认为链接已经建立好了而实际上可能在最后发送出去的消息中出现了问题链接没有建立完成 那么在这样的情况下客户端在认为自己成功之后下一步就会直接向服务端发送给消息那服务端在看到明明还没有建立好链接客户端就要给我发消息那么服务端就认为客户端以为建立好链接了实际上没有那么就会赶快把RST的标记位传入到报头中然后发给客户端然后客户端就会对于服务端进行链接重新建立
URG: 紧急指针是否有效
这个标记位表示的是紧急指针是否有效那该如何这个紧急指针呢
对于TCP的传输来说正常来说是要按照顺序到达的因为保持报文的顺序本身就是有序的一个前提条件。但是在有些情况下确实如果想要让部分数据进行插队那该如何处理呢此时就可以设置一个URG标记位表示的是紧急指针在这个紧急指针中存放的是数据的偏移量根据这个偏移量就可以找到这个紧急数据
一般来说在TCP的紧急指针只允许携带一个字节的数据