TCP包中的tcp segment of a reassembled pdu和PSH标志

1.“TCP segment of a reassembled PDU”

指TCP层收到上层大块报文后分解成段后发出去。于是有个疑问,TCP层完全可以把大段报文丢给IP层,让IP层完成分段,为什么要在TCP层分呢? 其实这个是由TCP的MSS(Maximum Segment Size,最大报文段长度)决定的,TCP在发起连接的第一个报文的TCP头里通过MSS这个可选项告知对方本端能够接收的最大报文(当然,这个大小是TCP净荷的大小),以太网上这个值一般设置成1460,因为1460Byte净荷+20Byte TCP头+20Byte IP头 = 1500字节,正好符合链路层最大报文的要求。

至于收到一个报文后如何确定它是一个"TCP segment"?如果有几个报文的ACK序号都一样,并且这些报文的Sequence Number都不一样,并且后一个Sequence Number为前一个Sequence Number加上前一个报文大小再加上1的话,肯定是TCP segment了,对于没有ACK标志时,则无法判断。

2. PSH

PSH是TCP报头中的一个标志位,发送方在发送数据的时候可以设置这个标志位.

当两个应用程序进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应.在这种情况下,TCP可以使用推送(push)操作.这时,发送端TCP将推送比特PSH置为1,并立即创建一个报文段发送出去.接收TCP收到推送比特置1的报文段,就尽快地(即"推送向前")交付给接收应用进程,而不再等到整个缓冲都填满了再向上交互. (故,PSH比特也叫急迫比特)

虽然应用程序可以选择推送操作,但推送操作还是往往不被人们使用,实际上现在的TCP协议栈基本上都可以自行处理这个问题,而不是交给应用层处理.

发送方使用该标志通知接收方将所收到的数据全部提交给接收进程(这里的数据包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其他数据.)  

在最初的TCP规范中,允许发送应用程序设置TCP的PSH标识.当发送应用程序设置TCP的PSH标识后,TCP应把发送缓存中的数据发送出去,而不需等待其他额外的数据,而接受端在收到PSH标志后,应该把已经接受到的数据提交给应用程序,而不需等待其他可能的数据.

多数源自伯克利(BSD)的TCP实现可在发送缓存被清空(发送缓存内的数据被全部发送)的时候自动设置PSH标识.因为应用程序在写数据给TCP时,就会被TCP发送(除非由于接受端窗口为0,或其他不能发送的原因).如果待发送的数据会清空发送缓存,那么协议栈栈就会自动为此包设置PSH标志.而因为源自BSD的TCP从不把接收到的数据延迟提交给应用程序,所以接收端会忽略掉接收到的PUSH标识.

PSH位就是用来通告接收方立即将收到的报文连同TCP接收缓存里的数据递交应用进程处理.一般会出现在发送方封装最后一个应用字段的TCP报文中,针对TCP交互式应用,则只要封装有应用字段的TCP报文,均会将PSH位置1.

3. 

不是每次http请求都会包含三次握手和结束后的握手连接, 如果上一次的连接没有断开, 则下一次将保持连接状态, 无需三次握手重连, 直接发送数据包即可

一次http请求时, post请求提包含长文本的示例

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/88090027