TCP报文段中的URG和PSH-程序员宅基地

技术标签: tcp  URG和PSH  Linus  

一:TCP报文段的首部格式
首先明白TCP虽然是面向字节流的,但TCP传输的数据单元确实报文段,一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中的个字段的作用,因此只有弄清楚TCP首部个字段的作用才能掌握TCP的工作原理.
TCP报文段首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项,,因此TCP首部的最小长度是20字节
这里写图片描述

二:首部固定部分各字段的意义:

(1)源端口和目的端口: 各占两字节,分别写入源端口号和目的端口号和UDP的分用类似,TCP的分用也是通过端口实现的.
(2)序号: TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号.整个要传送的字节流的起始序号必须在连接简历时设置,首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号.
(3)确认号: 占4字节是期望收到对方下一个报文段的第一个数据字节的序号
若确认号 =N,则表明:到序号N-1为止的所有数据都正确收到.
(4)数据偏移 : 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,这个字段实际上是指出TCP报文段的首部长度.
(5)保留: 占6位,保留为今后使用,但目前应置为0
(6)窗口: 占2字节.. 窗口字段用来控制对方发送的数据量,可以告知对方目前本身有的缓冲器容量(Receive Buffer) 还可以接收封包。当 Window=0 时,代表缓冲器已经额满,所以应该要暂停传输数据。单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限,这个值是本机期望一次接收的字节数。
(7)校验和: 占2字节当数据要由发送端送出前,会进行一个检验的动作,并将该动作的检验值标注在这个字段上; 而接收者收到这个封包之后,会再次的对封包进行验证,并且比对原发送的 Checksum 值是否相符,如果相符就接受,若不符就会假设该封包已经损毁,进而要求对方重新发送此封包!在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
(8)紧急指针: 占2字节这个字段是在 Code 字段内的 URG = 1 时才会产生作用。可以告知紧急数据所在的位置(紧急指针指出在本报文段中的紧急数据的最后一个字节的序号)。
(9)选项:长度可变。CP首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。
目前此字段仅应用于表示接收端可以接收的最大数据区段容量,若此字段不使用, 表示可以使用任意数据区段的大小。 这个字段较少使用。
TCP首部的主要选项:
最大报文段长度MSS是TCP报文段中的数据字段的最大长度。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”

三:TCP报文段首部6个控制位
(1):紧急URG: 当URG =1时,表明紧急指针字段有效.他告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级数据),而不要按原来的排队序列来传送
如:已经发送了很长的一个程序要在远地的主机上运行,但后来发现了一些问题,需要取消该程序的运行,用户从键盘发出中断Ctrl-C命令,如果不使用紧急数据,那么这两个字符将存储在接受TCP的缓存末尾,只有在所有数据处理完毕后这两个字符才被交付接收方的应用进程,这样就会浪费很多时间.

当URG置1时,发送应用进程告诉发送方的TCP右紧急数据要传送,于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据.这时要与首部中的紧急指针字段配合使用.
(2)确认ACK: 仅当ACK =1时确认号字段才有效.当ACK =0时,确认号无效.TCP规定,在连接建立后所有传送的报文段都必须把ACK置1
(3)推送PSH : 当两个应用进程进行交互式的通信时,有时宰一端的应用进程希望键入一个命令后立即就能够收到对方的响应,在这种情况下,TCP就可以使用推送(push)操作.这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去.接收方TCP收到PSH =1的报文段,就尽快地交付接受应用进程,而不是等到整个缓存都填满了后再向上交付.
注意:虽然应用程序可以选择推送操作,但推送操作还很少使用

(4)复位RST: 当RST =1时,表明TCP连接中出现严重差错(如由于本主机崩溃或其他原因),必须释放连接,然后再建立运输连接.RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接,RST也可称为重建位或重置位.
(5)同步STN: 在连接建立时用来同步序号.当SYC =1而ASK =0时,表明这时一个连接请求报文段.对方若同意建立连接,则应响应报文段中使用SYN=1和ASK =1.因此,SYN置1就表示这是一个连接请求或者连接接受报文
(6)终止FIN: 用来释放一个连接,当FIN =1时,说明此报文的发送方的数据已发送完毕,并要求释放运输连接.

部分参考<<计算机网络>>

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/f2016913/article/details/75006629

智能推荐

XMLHttpRequest send多个参数_xhr.send怎么发送变量-程序员宅基地

在工作中遇到了如何send多个参数在最开始之前是这样写的:var fd = new FormData()fd.append('file', this.$refs.file.files[0])this.uploadFileName = this.$refs.file.files[0].namevar xhr = new XMLHttpRequest()var thisInstance =..._xhr.send怎么发送变量

mac html制作,Mac下强大的网页制作软件-程序员宅基地

之前,小子已经发过了Mac下强大的网页制作软件:Coda及Coda 2。有了它,你就可以轻松的在Mac下编写代码,同时可以实时预览。今天,小子要分享的是最新版的Coda 2,版本号为V2.0.9,在之前的基础上优化了代码,使得你编写网页更加的简单、轻松。Coda是网页设计工作者强大的工具,是一款适用于Mac电脑的网页编程工具,具有多语言支持(HTML、PHP、JavaScript、CSS等)、代码..._苹果电脑可以开发网页吗

LeetCode: 66. Plus One-程序员宅基地

LeetCode: 66. Plus One题目描述Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.You may assume the integer do not contain any leading zero, except the number

ffmpeg 保存avcodec_decode_audio4之后的pcm数据-程序员宅基地

pFile=fopen("d:\\ffplay\\output.pcm", "wb"); ret = avcodec_decode_audio4(d->avctx, frame, &got_frame, &d->pkt_temp); if (got_frame) {float* ptr_l = (float*)frame->

Java架构师阿里P6学习资料-程序员宅基地

链接:https://pan.baidu.com/s/1TBKHu1GJrvQY3Sfxmb0fQw提取码:复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V6的分享ekoj

【Unscented Kalman Filter】C#无迹卡尔曼滤波Demo--两个示例附代码_十年一梦实验室的博客-程序员宅基地

示例1用到了ZedGraph进行绘图并保存结果图片。 示例2在WPF下使用Gu.Wpf.DataGrid2D控件显示数据和oxy:Plot控件绘图。示例1-ConsoleResult代码:using MathNet.Numerics.LinearAlgebra;using MathNet.Numerics.LinearAlgebra.Double;using System;us..._卡尔曼滤波c#实现

随便推点

FZU 2252 Yu-Gi-Oh!【思维+枚举】-程序员宅基地

Problem 2252 Yu-Gi-Oh!Accept: 30 Submit: 173Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description另一个平行宇宙的YellowStar,是一名游戏王决斗者,某一天它正在进行一场决斗,它的场面上拥有A只磁石战士a,B只磁石战士β,C只磁石

使用rar把程序打包成一个exe-程序员宅基地

根目录--全部文件--右键添加到压缩文件常规--创建自解压压缩文件高级--自解压选项解压路径--Finger(自己写)--在"Program Files"中创建设置--解压后运行Finger.exe(electron 打包后的执行文件)模式--全部隐藏更新--更新方式--选解压并更新文件(只有这样子才能保存文件) 覆盖方式--覆盖所有文件文本和图标 选择对应的图标 --确定 完成打包打包后的ex..._rar打包成exe

python同时装两个版本及装第三方库_可以同时安装不同版本的第三方库吗-程序员宅基地

在python 使用中 发现 python 2和python 3在语法上稍微不同,同时有一些第三方库也不能完全兼容两个版本 所以能同时装两个版本的python能解决这些问题首先安装两个版本的python到不同的路径中调用时,python 2用 py -2 +XXXXX.pypython3用 py -3 +XXXXX.py安装第三方库时,python2 用py..._可以同时安装不同版本的第三方库吗

Java并发学习(八)并发工具类与原子操作类_原子类和并发工具的关系-程序员宅基地

并发工具类 在Java并发包中提供了很多有用的并发工具类,并发工具类可以使任何一种对象,只要该对象可以根据自身的状态来协调控制线程的控制流。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括:信号量(Semaphore)、栅栏(Barrier)、闭锁(Latch)等。闭锁闭锁是一种同步工具类,可以延迟线程的进度直到其达到终止状态。闭锁作用相当于一扇门:在闭锁到达某一状态之..._原子类和并发工具的关系

推荐文章

热门文章

相关标签