一:Http请求与TCP连接之间的关系

1、HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP连接

2、HTTP/1.1 就把Connection: keep-alive 的 Header写进规范,并且默认开启长久连贯,除非申 请中写明 Connection: close,那么浏览器和服务器之间是会维持一段时间的 TCP 连贯。

3、HTTP/1.1 存在一个问题,单个TCP只能等到第一个请求得到响应才能发送第二个请求,

但是可以服务器建立多个TCP连接,Chrom最多容许对同一个Host建设六个TCP连贯。

4、HTTP/1.1 标准中规定Pipelining,一个TCP同时发送多个请求,收到的服务器必须按照申请顺序进行响应,但是存在很多浏览器不支持以及服务器也不支持,所以也没法使用。

5、http/2.0 的二进制分帧、多路复用 、头部压缩、申请优先级等,支持一个TCP连接同时发送多个请求,channel通道的概念。

二进制分帧:就是在应用层(HTTP)和传输层(TCP)之间增加一个二进制分帧层

帧:HTTP2.0通信的最小单位,所有帧都共享一个8字节的首部,其中包含帧的长度、类型、标志、还有一个保留位,并且至少有标识出当前帧所属的流的标识符,帧承载着特定类型的数据,如HTTP首部、负荷、等等。

消息:比帧大的通讯单位,是指逻辑上的HTTP消息,比如请求、响应等。由一个或多个帧组成

流:比消息大的通讯单位。是TCP连接中的一个虚拟通道,可以承载双向的消息。每个流都有一个唯一的整数标识符。

多路复用:

基于二进制分帧层,HTTP2.0可以在共享TCP连接的基础上同时发送请求和响应。

二:TCP连接与Socket关系

1、Socket【套接字】是TCP连接一端的实例,是网络通信过程中端点的抽象表示,

包含了网络通信所必须的五种信息:连接所使用的协议、本地IP地址、本地进程的协议端口、

远地主机的IP地址以及远地进程的协议端口。

2、Socket是实例,所以支持TCP/IP协议的网络通信基本操作单元也没毛病,

socket.connection()、socket.read()、socket.write()、socket.close()等,

客户端的Socket调用socket.connection()就是建立TCP连接的过程。

3、不同编程语言都有对Socket的实现,但是这些网络通信操作都是调用系统的相关接口实现的,所以也跟系统有关(windows/linux)

三:Socket与ServerSocket关系【BIO编程】

1、ServerSocket是做为服务端的,每次接收到客户端Socket的TCP连接时,

都会为该TCP连接生成一个Socket实例,所以TCP连接两端端点都是Socket实例,

记录了该TCP连接网络通信需要的信息以及网络通信的基本操作。

2、ServerSocket没有Socket的功能,不支持网络通信的基本操作。

四:SocketChannel与ServerSocketChannel关系【NIO编程】

1、ServerSocketChannel与ServerSocket主要就是接收连接appect()方法的区别,

ServerSocketChannel可以设置阻塞跟非阻塞两种,而ServerSocket只能是阻塞的。

2、Socket与SocketChannel主要就是读数据read()方法的区别,

SocketChannel可以设置阻塞跟非阻塞两种,而Socket只能是阻塞的。

注意:NIO中的SocketChannel与htpp/2.0中的虚拟通道Channel根本不是一回事,也与消息队列中那个Channel不是一回事。

人家的Channel实现了一个TCP连接并行发送多个请求的。

注意:Socket与SocketChannel每一个实例都会占用一个随机的端口。

五:Socket与文件描述符(window俗称为文件句柄)

1、个人理解:文件描述符就是Socket实例的引用地址,就跟Java对象的引用地址一样,

通过该引用就能操作Socket实例

2、一个文件描述符只是一个和打开的文件相关联的整数,背后可能是一个硬盘上的普通文件、

FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。

3、一个Java对象有内存的数据结构和内存地址, 那么一个文件描述符(file descriptor)

也有一个内核的数据结构和一个进程内的唯一编号来表示;

然后操作系统会把这个文件描述提供给应用层,应用层通过对这个文件描述符(file descriptor)去对传输链路进行数据的读取和写入

六:TCP连接与Channel通道的关系(额外插入表明SocketChannel与此Channel没关系)

1、客户端Socket发送了请求以及客户端Socket收到的响应必须要能对应起来。

Http演化过程:

1.1 【http/1.0】一个请求使用一个socket来发送和接收响应。

1.2 【http/1.1】多个请求使用一个socket来发送和接收响应,但是必须按照顺序,

不能并行发送,要一个请求发送以及接收响应后才能发送第二个请求。

1.3 【http/2.0】 多个请求使用一个socket来发送和接收响应,可以并行发送。

消息在链路层会被分装成帧,帧头含有该流【虚拟连接Channel【通道】】的唯一标识。

2、Channel是物理TCP连接中的虚拟连接。

3、所有的操作(例如:读、写)都会都会通过Connection中的Channel完成。

4、Channel可以复用Connection,即一个Connection下可以建立多个Channel。

5、当某个Connection断开时,该Connection下的所有Channel都会断开。

所有的AMQP协议操作(例如创建队列、发送消息、接收消息等)。

6、建议使用Channel来复用Connection,从而减少网络资源,也就是所谓的多路复用。

注意:此处的Channel与SocketChannel没有半毛钱关系,不要被误导。

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: