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 ...
随机推荐
- USB 2.0 Spec 微缩版
4.1.1 Bus Topology 最大层数为7,第7层只能是Function不能是Hub,非根Hub最大5级. 5.3 USB Communication Flow Host Controller ...
- php提高效率
1. foreach效率更高,尽量用foreach代替while和for循环. 2. 循环内部不要声明变量,尤其是对象这样的变量. 3. 在多重嵌套循环中,如有可能,应当将最长的循环放在内层,最短循环 ...
- js setTimeout
setTimeout用法 //每个0.5秒钟改变字体和背景颜色,字体一闪一闪的效果 var flag = 0; function start(){ var text = document.getEle ...
- HDU3530 子序列
题目大意:给出一串长度为n的整数串,求最长的一个连续子序列,满足该序列中最大的元素与最小的元素之差大于等于m, 并且小于等于k.n<=100000 分析:维护两个单调队列,一个递增的,维护最小值 ...
- linux 串口阻塞与非阻塞参数设置
在串口设置中,有以下两个参数可以决定是否阻塞. 在打开串口时不加O_NODELAY,可用下面的第二种方法,来进行阻塞/非阻塞的设定 c_cc[VTIME] 非规范模式读取时的超时时间(单位:百毫秒), ...
- c++学习-字符串
字符数组和 string类型比较的区别 #include<iostream> #include<string> using namespace std; class area{ ...
- XHTML的使用规范
一.XHTML的简介 XHTML指的是可扩展超文本标记语言 XHTML与HTML4.01几乎是相同的 XHTML是更严格更纯净的HTML版本 XHTML是以XML应用的方式定义的HTML 二.为什么使 ...
- JAVA break终止循环,与continue进入下一次循环
一.break终止循环 在循环中,遇到break;将会跳出循环,继续往下执行代码 public class Test{ public static void main(String[] args){ ...
- Mac下配置JAVA_HOME
http://blog.csdn.net/shallowgrave/article/details/39367119 闲来无事,装个Hbase玩玩,突然发现Mac下默认安装的JDK7,没有配置JAVA ...
- repo安装
repo是使用python开发的一个用于多版本管理的工具,可以和git协作,简化git的多版本管理. repo安装: 1.新建~/bin,并将此目录包含在path变量中(如果已存在,且已在path变量 ...