HTTP协议----->连接管理
1. TCP连接
1.1 TCP为HTTP提供了一条可靠的比特传输管道。
TCP(Transmission Control Protocol)----传输控制协议,是主机对主机层的传输控制协议,提供可靠的连接服务。 TCP的数据是通过名为IP分组(或IP数据报)的小数据块来发送的。HTTP/HTTPS网络协议栈如下所示:

- HTTP收到一条报文时,报文数据内容转化为流的形式;
- 数据流通过一条打开的TCP连接按顺序传输;
- TCP收到数据流,将数据流砍成为被称作为段的小数据块;
- 将小数据块封装的IP之中;
- 通过英特网完成传输;
TCP段都是由IP分组承载(下图表示为TCP某段的参数),从一个IP地址发到另外一个IP地址。每一个IP分组中都包括:
- 一个IP分组首部(通常20字节)--->包含源和目的的IP地址、长度、其他的标记;
- 一个TCP段首部(通常20字节)--->包含TCP端口号、TCP控制标记、数据排序和完整性检查的数字值;
- 一个TCP数据块(0个或者多个字节)--->要传送的报文数据流;
TCP段#x

TCP的连接通过四个值来识别:
<源IP地址 、 源端口号 、 目的IP地址 、 目的端口号>
TCP分段传输示意如下:

1.2 TCP套接字编程
伪代码说明通过套接字API,客户端和服务器实现HTTP事务时执行的步骤:

1.3 TCP三次握手四次挥手(划重点!!!)
要知道!!! 什么是三次握手,为什么不是两次?什么是四次挥手?第二三次挥手为什么不合并呢?
先说说TCP的标志位,有6种标示:
- SYN(synchronous建立联机)
- ACK(acknowledgement 确认)
- PSH(push传送)
- FIN(finish结束)
- RST(reset重置)
- URG(urgent紧急)
三次握手,数据传输,四次挥手图:

那为什么需要三次握手呢?基于上图所示,如下的过程:
- 客户端C向服务器S发起建立连接请求:C——>S;
- 客户端C收到服务器S的发送信号,并且向客户端C发送确认信息:S——>C;
- 客户端C收到服务器S的确认信号,并向S发送确认信号:C——>S。
三次握手大概就是这么个过程:
- 通过第一次握手,服务器S知道客户端C能发送数据。
- 通过第二次握手,客户端C知道服务器S能收、能发送数据。
- 结合第三次握手,服务器S知道客户端C能够接收数据。
至此,完成了握手过程,客户端C知道能服务器S能收能发,服务器S知道客户端C能收能发,通信连接至此建立。
两个要点:(要知道!!!)
- 三次握手的完成,只是一个客户端C和服务器S是否能够相互建立连接的确认过程,还没有进行真正数据块儿的传输,数据块的传输是在三次握手完成之后的事情;
- 采用两次握手可能会出现失效情况,客户端发出的连接请求没有收到服务器的确认(没有第二次握手),于是经过一段时间后,客户端又重新向服务器发送新的连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,客户端第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到服务器,服务器以为是客户端又发起的新连接,于是服务器同意连接,并向客户端发回确认,但是此时客户端根本不会理会,服务器就一直在等待客户端发送数据,导致服务器的资源浪费。三次握手是保证可靠的最小握手次数,再多次握手也不能提高通信成功的概率,反而浪费资源。
四次挥手,结合上图,请看如下过程:
- 客户端C向服务器S发起请求,表示客户端C没有数据要发送了:C——>S;
- 服务器S向客户端C发送信号,确认客户端C的断开请求请求:S——>C;
- 服务器S向客户端C发送信号,请求断开连接,表示服务器S没有数据要发送了:S——>C;
- 客户端C向服务器S发送确认信号,同意断开:C——>S。
服务器S收到确认信号,断开连接,而客户端在一段时间内没收到服务器的信号,表明服务器S已经断开了,于是客户端C也断开了连接。至此,完成挥手过程。
为什么需要四次挥手,第二第三次挥手能合并哇???
当然不可以!挥手和握手相似,确认断开过程,但是,挥手要多一个确认数据的断开,不仅仅是确认连接的断开,所以要比握手多一次。握手---->连接的建立;挥手---->连接的断开+数据的断开(多一次)。
HTTP协议----->连接管理的更多相关文章
- 转-HttpClient4.3 连接管理
转 http://www.yeetrack.com/?p=782 2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大 ...
- SOFA 源码分析 — 连接管理器
前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络 ...
- Netty中的连接管理
连接管理是我们首先需要关注的,检测空闲连接以及超时对于及时释放资源来说是至关重要的.由于这是一项常见的任务,Netty特地为它提供了几个ChannelHandler实现. 用于空闲连接以及超时的Cha ...
- 和我一起学《HTTP权威指南》——连接管理
连接管理 1.TCP连接 几乎所有的HTTP通信都是由TCP/IP承载的. 浏览网页时客户端执行的操作: 如浏览http://www.joes-hardware.com:80/power-tools. ...
- httpclient 连接管理器
连接操作器 连接操作是客户端的底层套接字或可以通过外部实体,通常称为连接操作的被操作的状态的连接. OperatedClientConnection接口扩展了HttpClientConnection接 ...
- Netty(六):Netty中的连接管理(心跳机制和定时断线重连)
何为心跳 顾名思义, 所谓心跳, 即在TCP长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, 有可 ...
- 5G RRC——为NAS层提供连接管理,消息传递等服务; 对接入网的底层协议实体提供参数配置的功能; 负责UE移动性管理相关的测量、控制等功能
from:http://www.cnblogs.com/kkdd-2013/p/3868676.html 1 RRC协议功能 为NAS层提供连接管理,消息传递等服务: 对接入网的底层协议实体提供参数配 ...
- TCP系列07—连接管理—6、TCP连接管理的状态机
经过前面对TCP连接管理的介绍,我们本小节通过TCP连接管理的状态机来总结一下看看TCP连接的状态变化 一.TCP状态机整体状态转换图(截取自第二版TCPIP详解) 二.TCP连接建立 ...
- TCP系列02—连接管理—1、三次握手与四次挥手
一.TCP连接管理概述 正如我们在之前所说TCP是一个面向连接的通信协议,因此在进行数据传输前一般需要先建立连接(TFO除外),因此我们首先来介绍TCP的连接管理. 通常一次完整的TCP数据传输一般包 ...
随机推荐
- 用js筛选数据排序
题目 参考以下示例代码,页面加载后,将提供的空气质量数据数组,按照某种逻辑(比如空气质量大于60)进行过滤筛选,最后将符合条件的数据按照一定的格式要求显示 <!DOCTYPE html> ...
- lesson - 9 课程笔记
一. yum 作用: yum 命令是在Fedora 和RedHat 以及SUSE 中基于rpm 的软件包管理器,它可以使系统管理人员交互和自动 ...
- 添加MD5 密码加密
编辑 /etc/grub/grub.conf 配置文件 password = 123456 password --md5 $5$H.........SS grub-crypt --md5 ...
- Logback分别打印info日志和error日志
<?xml version="1.0" encoding="utf-8" ?><configuration> <appender ...
- K:java中序列化的两种方式—Serializable或Externalizable
在java中,对一个对象进行序列化操作,其有如下两种方式: 第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializ ...
- Q:算法(第四版)—第一章
1.1.14:编写一个静态方法lg(),接受一个整型参数N,返回不大于log2N的最大整数(ps:不使用Math库) 分析: 利用将公式k=log2N转化为N=2k的原理,不断的逼近其输入的值N,当N ...
- requireJS(版本是2.1.15)学习教程(一)
一:为什么要使用requireJS? 很久之前,我们所有的JS文件写到一个js文件里面去进行加载,但是当业务越来越复杂的时候,需要分成多个JS文件进行加载,比如在页面中head内分别引入a.js,b. ...
- RBAC__权限设计__结构化表的输出(不知道怎么描述标题,反正就是设计表) 难点重点 必须掌握🤖
RBAC 反正就是很厉害. 干就完事了,不BB 直接进入正题 本文写的就是如何设计表,以及设计表的思路. 用户和角色 : 多对多字段放在哪张表更好点? 用户找角色,角色找权限. 放在user表中,是正 ...
- commons-dbutils 字段名称转换
我们在写bean的时候,字段通常都使用小驼峰命名法,但是在设计数据库时,一般使用下划线分割命名.这样,在取出数据库字段时,还需要转换.如何简洁的实现这种转换呢? 你能遇到的问题,只要是普遍存在的,大家 ...
- TensorFlow实现knn(k近邻)算法
首先先介绍一下knn的基本原理: KNN是通过计算不同特征值之间的距离进行分类. 整体的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于 ...