请求、TCP连接、Socket、SocketChannel、ServerSocket、ServerSocketChannel、文件描述符概念理解

一: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没有半毛钱关系,不要被误导。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不死就是干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值