一: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没有半毛钱关系,不要被误导。
精彩文章
发表评论