博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Linux高性能服务器编程》——3.6 TCP交互数据流
阅读量:6996 次
发布时间:2019-06-27

本文共 1629 字,大约阅读时间需要 5 分钟。

3.6 TCP交互数据流

前面讨论了TCP连接及其状态,从本节开始我们讨论通过TCP连接交换的应用程序数据。TCP报文段所携带的应用程序数据按照长度分为两种:交互数据和成块数据。交互数据仅包含很少的字节。使用交互数据的应用程序(或协议)对实时性要求高,比如telnet、ssh等。成块数据的长度则通常为TCP报文段允许的最大数据长度。使用成块数据的应用程序(或协议)对传输效率要求高,比如ftp。本节我们讨论交互数据流。

考虑如下情况:在ernest-laptop上执行telnet命令登录到本机,然后在shell命令提示符后执行ls命令,同时用tcpdump抓取这一过程中telnet客户端和telnet服务器交换的TCP报文段。具体操作过程如下:

$ tcpdump –nt –i lo port 23$ telnet 127.0.0.1Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.Ubuntu 9.10ernest-laptop login: ernest(回车)    #输入用户名并回车Password:(回车)                #输入密码并回车ernest@ernest-laptop:~$ ls(回车)

上述过程将引起客户端和服务器交换很多TCP报文段。下面我们仅列出我们感兴趣的、执行ls命令产生的tcpdump输出,如代码清单3-4所示。

image

TCP报文段1由客户端发送给服务器,它携带1个字节的应用程序数据,即字母“l”。TCP报文段2是服务器对TCP报文段1的确认,同时回显字母“l”。TCP报文段3是客户端对TCP报文段2的确认。第4~6个TCP报文段是针对字母“s”的上述过程。TCP报文段7传送的2字节数据分别是:客户端键入的回车符和流结束符(EOF,本例中是0x00)。TCP报文段8携带服务器返回的客户查询的目录的内容(ls命令的输出),包括该目录下文件的文件名及其显示控制参数。TCP报文段9是客户端对TCP报文段8的确认。TCP报文段10携带的也是服务器返回给客户端的数据,包括一个回车符、一个换行符、客户端登录用户的PS1环境变量(第一级命令提示符)。TCP报文段11是客户端对TCP报文段10的确认。

在上述过程中,客户端针对服务器返回的数据所发送的确认报文段(TCP报文段6、9和11)都不携带任何应用程序数据(长度为0),而服务器每次发送的确认报文段(TCP报文段2、5、8和10)都包含它需要发送的应用程序数据。服务器的这种处理方式称为延迟确认,即它不马上确认上次收到的数据,而是在一段延迟时间后查看本端是否有数据需要发送,如果有,则和确认信息一起发出。因为服务器对客户请求处理得很快,所以它发送确认报文段的时候总是有数据一起发送。延迟确认可以减少发送TCP报文段的数量。而由于用户的输入速度明显慢于客户端程序的处理速度,所以客户端的确认报文段总是不携带任何应用程序数据。前文曾提到,在TCP连接的建立和断开过程中,也可能发生延迟确认。

上例是在本地回路运行的结果,在局域网中也能得到基本相同的结果,但在广域网就未必如此了。广域网上的交互数据流可能经受很大的延迟,并且,携带交互数据的微小TCP报文段数量一般很多(一个按键输入就导致一个TCP报文段),这些因素都可能导致拥塞发生。解决该问题的一个简单有效的方法是使用Nagle算法。

Nagle算法要求一个TCP连接的通信双方在任意时刻都最多只能发送一个未被确认的TCP报文段,在该TCP报文段的确认到达之前不能发送其他TCP报文段。另一方面,发送方在等待确认的同时收集本端需要发送的微量数据,并在确认到来时以一个TCP报文段将它们全部发出。这样就极大地减少了网络上的微小TCP报文段的数量。该算法的另一个优点在于其自适应性:确认到达得越快,数据也就发送得越快。

转载地址:http://xhdvl.baihongyu.com/

你可能感兴趣的文章
理解JavaScript中的事件处理
查看>>
Win7 公布网站 HTTP 错误 404.4 - Not Found
查看>>
特征选择方法之信息增益
查看>>
mac jdbc连接mysql
查看>>
Activity生命周期的学习以及Logcat的使用
查看>>
Longest Valid Parentheses leetcode java
查看>>
Android的两种菜单
查看>>
poj 1218 THE DRUNK JAILER
查看>>
WordPress SEO ☞ WordPress网站终极优化指南
查看>>
Environment 常用方法
查看>>
【TYVJ】1338 QQ农场(最大流+最大权闭合图)
查看>>
解决Python2.7的UnicodeEncodeError: 'ascii' codec can’t encode异常错误
查看>>
最近在准备开发进销存管理系统
查看>>
TCP/IP协议
查看>>
【C#】Entity Framework 增删改查和事务操作
查看>>
原创:谨以此文怀念曾经的妹妹
查看>>
作为平台的Windows PowerShell(二)
查看>>
Linux find example
查看>>
jquery之超简单的div显示和隐藏特效demo
查看>>
1、开发自定义组件简要
查看>>