TCP和HTTP的关系
TCP和HTTP的关系
首先简单地看看tcp,TCP连接是通过4个值来识别的:
<源IP地址 源端口号 目的IP地址 目的端口号>
这四个值定义了一个TCP连接,两条不同的TCP连接中这四个值是不可能完全都相同的。
在第一篇中有一个简单的HTTP介绍,下面是一个比较完整的HTTP连接过程:
由此看出,http实际上是在tcp协议(建立连接通信)的基础上传输的,但是tcp有一些本身的机制阻止了http的性能:
①客户端发送一个请求到服务器,建立一个tcp连接是需要消耗一定的时间的,如果我们发送了上百个连接,那么这个时间就会大大增加。
②tcp是慢启动的,也就是说,在tcp连接刚刚建立起来的时候,传输的速度会被限制,假如传输成功,随着连接建立的时间推移,传输速度才会被提升。而在http是无状态的,每次客户端提出一个请求,都要重新建立一个连接。
③TCP中有一个Nagle算法,它鼓励把数据攒到了一定数量了再发包,而一般而言,http中一些小的报文,根本无法积累到那个数量,这样就造成了等待哪些永远都无法到来的额外数据造成的损失。
④tcp有一个运行机制,就是一个连接被关闭的时候,内存中会维护一个信息,在一定的时间范围内,不会创建一个具有相同地址和端口号的新连接。如果http请求被发送,那么端口有可能很快就会被耗尽,毕竟可以用的端口是有限的。
http的连接管理方式
在http中最简单的事务处理,就是串行事务处理了。假设一个页面有两张图片,客户端请求这个页面,一共要发起3个事务(串行地建立)。这种方式效率非常低,要经历三次慢启动和连接延时。
比起串行事务处理,并行连接处理事务的效率就要稍微好一些了,它将先发起一个连接,然后同时发起两个连接加载图片,但是这种方式,依然存在一个问题,就是发起了很多的连接,这样很快就会耗尽端口资源,并且带宽如果不是很宽,所有的连接都去竞争带宽,网页的加载速度就会很慢了。其实,并行连接,只是让人感觉快一点,因为它发起了和串行一样多的TCP连接,多次延迟和慢启动问题依然没有解决。
所以,一种持久连接被人制定出来。即一次,只打开一条tcp连接,在一个期待的时间范围内,这个连接不会被关闭,在此期间,所有的http事务都会在这条tcp连接中传输。这样就可以节约,由于tcp连接建立,带来的延迟和慢启动的问题了。但是由于,http是无状态的,期待时间并不是一个被承诺的值,这条连接随时都可能被关闭。一个客户端对任何服务器和代理最多只能维护两条持久连接,这样也是为了防止服务器过载。
在持久连接的基础上,http/1.1又进行了一个优化——允许建立一个请求管道。当第一条请求发出去后,可以放入多条请求,然后被连续的发送(不必等待响应报文到达就就发送下一条请求报文),这样大大优化了性能。这里应该注意如果我们不确定我们连接是持久的,就不该使用管道。客户端也要做好连接被随时关闭的准备,这意味着一些信息要被重新发送,这些信息不应该是像post这样的重要传输信息,假如我们在网上购物,提交了一份订单,但是因为管道被关闭的问题,post被再次发送,那么会造成一定的混乱。
什么时候连接会被关上?
第一种自然是tcp的正常关闭了。当一个事务被完成,两端会先关闭输出信道,客户端和服务器都告诉对方,没有更多的数据了之后,两端把输入信道也关闭了。这样连接就被关闭了。
而其他的连接关闭方式,就显得不是很美好了。比如:当一个客户端在写一个比较大的请求报文的时候,连接是空闲的,服务器认为连接已经没有用了,就会关闭连接了。有时候,客户端的网络出现了问题,连接被意外关闭了,但数据还在传输,服务器就要应对这种情况,尽量保证数据的完整性。
这里只是简单地描述了下tcp和http的关系,实际上它们在工作的过程中会遇到诸如网关,代理等因素影响,导致更麻烦的问题。不过一旦了解了这些概念,我们可以就可以更好地优化自己的站点了。
TCP和HTTP的关系的更多相关文章
- Http TCP/IP 协议的关系
转自:http://www.cnblogs.com/ymy124/archive/2012/03/18/2404958.html 项目要求Web服务是高安全级别,在选择.net remoting,we ...
- tcp/ip协议栈调用关系图
最近阅读了tcp/ip详解卷2,总结一下整个发送过程和接收过程 sendmsg \/ sendit \/ sosend(这一步将数据从用户空间拷贝到内核空间,并且会在这一步判断发送缓存空间是否充足,是 ...
- TCP UDP HTTP 的关系和区别
TCP UDP HTTP 三者的关系: TCP/IP是个协议组,可分为四个层次:网络接口层.网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传 ...
- 门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结
门面模式的一个典型应用:Socket 套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息: 连接使用的 ...
- OSI七层和TCP/IP四层的关系、TCP与UDP、HTTP、Socket
HTTP(应用层协议):超文本传输协议,HTTP协议是建立在TCP协议之上的一种应用. HTTP协议详细解释 2Http详解 TCP(面向连接的传输层协议):transmission control ...
- socket连接和TCP连接的关系
我们在数据传输时,能够仅仅使用(传输层)TCP/IP协议,可是那样的话,假设没有应用层.便无法识别数据内容,假设想要使传输的数据有意义.则必须使用到应用层协议,应用层协议有非常多,比方HTTP.FTP ...
- TCP/IP, WebSocket 和 MQTT
按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP和MQTT是应用层的协议.在这三者之间, TCP是HTTP和MQTT底层的协议.大家对HTTP很熟悉,这里简要介绍下MQTT.M ...
- TCP/IP中最高大上的链路层简介(二)
引言 对于程序猿来讲,似乎越接近底层,就越显得高大上.这也算是程序猿们的共同认知吧,虽然不是所有人.今天LZ就和各位一起探讨一下TCP/IP中最高大上的一层,也就是最底层的链路层. 这一层LZ了解的还 ...
- 【转】IP分片和TCP分段
ZC: 由于 TCP中 MSS 的关系,TCP 不会造成 IP分片和TCP分段 ! 1.http://zhidao.baidu.com/link?url=YCnR8B-1EN4-cgauRtwa-iV ...
随机推荐
- HTML5常识总结(一)
一.HTML5的发展历程 + html演变的几个版本: html2.0.html3.2.html4.0.html4.01.html5. + 其中在html4.01发布之后,还发布了xtml1.0,它是 ...
- 剑指offer系列61---数组中的逆序对
[题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统 ...
- 【Java安装】Centos6.8 安装Java1.6
安装java 1.6 Centos6.8安装完成后,一般都安装了java,为了安装java1.6,需要卸载系统自带的java,主要步骤: 先安装java1.6,目的:为了防止先卸载系统自带java时, ...
- quotas and disk replace on netapp
==================================================================================================== ...
- svn 同步脚本
REPOS="$1"REV="$2"export LANG=en_US.UTF-8/usr/bin/svn update /home/wwwroot/yswif ...
- ZooKeeper典型应用场景(转)
ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题.网上 ...
- PHP转换UTF-8和GB2312的URL编码(转)
目前WEB的应用中, UTF-8编码和GB2312编码是并存在的,例如百度(baidu.com)和谷歌(google.com)的URL编码分别是GB2312编码和UTF-8编码.由于编码并存引起的乱码 ...
- Linux 2.6 内核实时性分析 (完善中...)
经过一个月的学习,目前对linux 下驱动程序的编写有了入门的认识,现在需要着手实践,编写相关的驱动程序. 因为飞控系统对实时性有一定的要求,所以先打算学习linux 2.6 内核的实时性与任务调 ...
- ExtJs4 SpringMvc3 实现Grid 分页
新建一个Maven webapp项目,webxml以及spring配置没什么需要注意的,不再赘述. Maven依赖:(个人习惯,有用没用的都加上...) <project xmlns=" ...
- RedisCacheTool参考其中的文件读写功能
package com.jr.market.tool; import java.io.BufferedReader; import java.io.File; import java.io.FileI ...