【计算机网络】TCP通信的细节及TCP连接对HTTP事务处理性能影响
2017-03-23 17:43
666 查看
从三次握手的细节说起
刚开始尝试使用java等后端语言写IO流,或用套接字(socket)实现简单C/S通信的同学们,常常会接触到的一个概念:就是所谓的“三次握手”,socket作为一个API接口,封装了TCP/IP通信的细节,使我们只需要调用简单的接口而无需关心具体的实现,那么Socket三次握手的细节是如何实现的?
三次握手的过程实际上就是相互抛/接(3次)包的过程三次握手的过程:
客户端抛 --> SYN包(建立连接包) --> 服务器接收服务器抛 --> ACK包(确认应答包)和SYN包 --> 客户端接收
客户端抛 --> ACK包(确认应答包) --> 服务器接收
建立连接后客户端便可从服务器接收数据包进行通信
[b]注意:[/b]三次握手时抛/接的包和连接建立后收发的数据包是不同的!前者是只携带有TCP报文和IP报文头部的包,不携带具体的数据内容,而后者除了TCP和IP报文头部还携带了具体的数据
建立连接后的通信过程:
l 发送端 --> 数据包 --> 接收端l 接收端 --> ACK确认应答 --> 发送端
TCP是全双工通信:
这里的发送端/接收端可以是客户端/服务器,也可以是服务器/客户端,因为TCP通信是全双工通信,所以建立连接后可以同时进行以下两个过程:A. 客户端 --> 数据包 --> 服务器 --> ACK应答 --> 客户端
B. 服务器 --> 数据包 --> 客户端 --> ACK应答 --> 服务器
ACK包/FIN包/SYN包的具体组成:
如下图三次握手时交换包的具体组成:TCP首部+IP首部(无具体数据内容!)建立连接后收发数据包的具体组成:
[b](TCP首部+IP首部+具体数据)[/b]
TCP通信的单位——段
TCP通信以段为单位,段由TCP数据和TCP首部组成如果再将网络层的IP协议考虑进去的话,TCP/IP通信以IP分组为单位
IP分组=TCP段+IP首部=(TCP数据+TCP首部)+IP首部
注:TCP首部也算是IP数据包的一部分
TCP的"串行式"连接和"管道式"连接
A.TCP“串行式”连接
建立连接后,最简单的TCP通行是串行进行的,单次通信发送端只能发送一个段。只有在接收到接收端发来的ACK应答包前,才能将第二个段发出去,这段时间内发送端只能空等待B.TCP“管道式”连接
很显然,串行通信效率很低,所以我们想,能不能在第一个段发送出去后,无需等待ACK应答的返回就发送第二个段呢?这样效率不就提高了吗?基于这个理念人们提出了窗口的概念:[b]窗口:无需等待ACK应答的返回就可以连续发送的段的数量的最大值[/b]
上图中,窗口大小为4,段的发送就好像管道一般,窗口大小就好比是“管道”的流量
TCP连接对HTTP事务处理性能的影响
HTTP作为一种应用层协议,其事务处理要依赖于传输层的TCP协议机制的运作,所以HTTP事务处理的性能瓶颈很大程度上来源于TCP连接,体现在下面几点:TCP连接时间的消耗
TCP的慢启动机制
TCP采用的Nagle算法
每次TCP连接带来的时延是HTTP时延的重要来源
[b]解决方法:采用HTTP持久连接技术消除多次连接的时延[/b]
TCP的慢启动机制
TCP慢启动机制体现在两方面:a.限制初次启动时发送的段的数量:
上面提到了TCP窗口的概念,但TCP能不能一开始就发送窗口上限的段呢?答案是不能的,因为这会造成网络拥塞,为了避免这个问题,TCP采用了慢启动机制,一开始发送的段数为1,抛接完成后将段数上升为2,然后是4,再然后是8,段数将以指数形式递增,直到窗口大小的上限
b.设置慢启动阀值
由上图可以看到,当达到拥堵窗口的大小时,将导致超时重发,这时初次发送的段数又从1开始指数递增,不同的地方是:这时候设置了慢启动阀值(拥堵窗口的一半),发送的段数达到慢启动阀值时,将不再以指数形式上升,而是按一定的比例缓慢得直线上升
[b]解决方法:正是因为单次TCP连接的时延和TCP的慢启动机制,HTTP的持久连接才显得尤为重要[/b]
Nagle算法
TCP协议本身并没有有规定发送单个段的数据包大小的最小值,那让我们想想,如果我们试图在单个段中发送几个字节的数据包会怎样呢?如果这样,TCP将通过Nagle算法的机制来提高网络利用率,很显然,将包含数据量极小的段都单独发出去将会极大降低网络利用率,所以通过Nagle算法,不直接派发小数据量的段,而是选择将它们绑定在一起,当达到要求尺寸后才派发出去,这造成了时间上的延迟。Nagle算法是一把双刃剑,它提高了网络利用率,但同时造成了TCP的时延[b]解决方法:Nagle是可以选择关闭的,当然,前提是你得在TCP通信中写入大块的数据[/b]
参考资料:
《HTTP权威指南》作者古尔利《图解TCP/IP》作者竹下隆史
相关文章推荐
- 计算机网络中socket,TCP,HTTP,长连接等概念的形象比喻,便于理解和记忆
- 网络编程之TCP通信,为什么在Serve端为每个Client端开辟一个单独的线程来处理Client的请求
- [导入]用TCP/IP 网络连接过滤保护用户计算机
- 【计算机网络】TCP关闭连接问题及注意
- <计算机网络-自顶向下方法> TCP连接
- 网络通信:SOCKET, TCP/UDP, HTTP, FTP(温故知新!)
- 一个基于VB.net的异步Socket网络TCP通信可防止任意一端意外终止TCP连接的类,。
- 《HTTP权威指南》之HTTP连接管理及对TCP性能的考虑
- 《Android开发卷——HTTP网络通信,HTTP网络连接》
- 网络编程释疑之:TCP半开连接的处理
- 仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)
- 【计算机网络】TCP关闭连接问题及注意
- (转载)C#网络通信之TCP连接
- android http通信方式连接网络
- [导入]用TCP/IP 网络连接过滤保护用户计算机
- 【计算机网络】TCP关闭连接问题及注意
- android http通信方式连接网络
- java程序员菜鸟进阶(七)《HTTP权威指南》之HTTP连接管理及对TCP性能的考虑
- [计算机网络] TCP连接的建立和终止
- 性能网络编程4--TCP连接的关闭