首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TCP中push和urgent标志的区别

TCP中push和urgent标志的区别
EN

Stack Overflow用户
提问于 2012-02-06 06:15:10
回答 3查看 69.7K关注 0票数 62

我正在尝试理解带有标志PSH和带有标志URG的TCP数据段之间的区别。我读取了RFC,但仍然无法获取它,它们中的一个是在将数据发送到进程之前缓冲数据,而另一个不是?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-06 06:40:09

这是两种截然不同的机制。

###PSH和推送功能

当您发送数据时,您的TCP会对其进行缓冲。因此,如果你发送一个字符,它不会立即发送,而是等待,看看你是否有更多。但也许你想让它直接上线:这就是PUSH函数的用武之地。如果您推送数据,您的TCP将立即创建一个段(或几个段)并推送它们。

但故事并没有到此为止。当对等TCP接收到数据时,它会自然地对它们进行缓冲,它不会干扰应用程序的每一个字节的。这就是PSH标志发挥作用的地方。如果接收TCP看到PSH标志,它会立即将数据推送到应用程序。

没有设置PSH标志的应用程序接口。通常,它是由内核在清空缓冲区时设置的。来自TCP/IP图解:

该标志通常用于指示在发送分组的同时发送分组的一端的缓冲器已经被清空。换句话说,当设置了PSH位字段的数据包离开发送方时,发送方没有更多的数据要发送。

但要知道史蒂文斯也说过:

推送(接收方应尽快将此数据传递给应用程序-未可靠地实现或使用)

###URG和面向对象数据

TCP是一种面向流的协议。所以如果你把64K字节放在一边,你最终会在另一边得到64k字节。所以想象一下,你推送了大量数据,然后有一些消息说:“嘿,你知道我刚刚发送的所有数据吗?是的,把它扔掉”。问题的要点是,一旦您在连接上推送数据,您就必须等待接收方在获得新数据之前获得所有数据。

这就是URG标志发挥作用的地方。当您发送紧急数据时,TCP会创建一个特殊的数据段,在其中设置URG标志和紧急指针字段。这会导致接收TCP在单独的通道上将紧急数据转发给应用程序(例如,在Unix上,您的进程将获得一个SIGURG)。这允许应用程序在带外?之外处理数据

顺便说一句,重要的是要意识到,紧急数据现在很少使用,也没有很好地实现。使用单独的通道或完全不同的方法要容易得多。

²:RFC 6093不同意这种“带外”的用法,并声明:

紧急机制不是用于发送“带外”数据的机制:所谓的“紧急数据”应该被“在线”传送给TCP。

但它接着承认:

默认情况下,“紧急数据”的最后一个字节是“带外”传送给应用程序的。也就是说,它不会作为正常数据流的一部分进行传送。

应用程序必须走自己的路,并指定SO_OOBINLINE等,以获得符合标准的紧急语义。

如果所有这些听起来都很复杂,那就不要使用 data。

票数 114
EN

Stack Overflow用户

发布于 2014-09-21 21:22:24

将更多信息添加到已回答的信息中。

  • URG位,如果设置了数据的优先级,这意味着不是等待在“紧急”数据之前的整个字节流被发送,而是在紧急的基础上发送紧急数据,而不是等待在它前面的整个字节流被发送。
  • URG位被设置时,urgent指针也被设置(在TCP报头选项字段中: 16位)。
  • URG指针告诉已经到达的数据段中有多少字节的数据是紧急的。(例如,如果数据大小是100字节,并且只有前50个字节是紧急的,则紧急指针将具有值50)。
  • 现在转到PSH位。TCP位的目的是告诉PSH不要等待缓冲区变满并立即发送数据。同样,当接收器接收到设置了PSH标志的数据段时,应该立即将数据发送到上层,而无需等待接收缓冲区变满。这方面的一个实际示例是telnet应用程序,在该应用程序中,应用程序以击键次数较少的形式发送数据。如果远程登录等待缓冲区变满,然后将数据传输到接收器,则远程登录将变得不可用。
票数 9
EN

Stack Overflow用户

发布于 2012-02-06 06:27:22

我不会过于严格地接受RFC中的所有内容,这些标志的实现似乎有一些模棱两可的地方。URG负责在填充缓冲区之前发送数据包,而PSH在接收端控制数据在堆栈中向上移动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9153566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档