HTTP & Socket

作者: 勇敢的_心_ | 来源:发表于2018-03-14 23:29 被阅读90次

    HTTP

    HTTP连接管理

    HTTP连接的过程


    连接过程.jpg
    HTTP事务的时延

    原因:

    • 客户端首先需要根据URI确定Web服务器的IP地址和端口号。
    • 接下来,客户端会向服务器发送一条 TCP 连接请求, 并等待服务器回送一个请求接受应答。
    • 一旦连接建立起来了,客户端就会通过新建立的 TCP 管道来发送 HTTP 请求。
    • 最后,Web 服务器会回送 HTTP 响应。

    这些TCP网络时延的大小取决于硬件速度、网络和服务器的负载,请求和响应报文的尺寸,以及客户端和服务器之间的距离。

    TCP连接的握手时延

    TCP连接的握手时延对应于上图的建立连接部分。发送任意数据,当新建立一条TCP连接时,都会走一下如下握手过程。如果连接只用来传送少量数据,这些握手过程就会严重降低 HTTP 的性能。

    TCP 连接握手需要经过以下几个步骤:

    • 请求新的 TCP 连接时, 客户端要向服务器发送一个小的 TCP 分组( 通常是 40 ~60 个字节)。 这个分组中设置了一个特殊的 SYN 标记,说明这是一个连接请求。(a部分)
    • 如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP 分组,这个分组中的 SYN 和 ACK 标记都被置位,说明连接请求已被接受。(b部分)
    • 最后, 客户端向服务器回送一条确认信息, 通知它连接已成功建立(c部分)
    TCP慢启动

    TCP 连接会随着时间进行自我“ 调谐”, 起初会限制连接的最大速度, 如果数据成功传输, 会随着时间的推移提高传输的速度。 这种调谐被称为 TCP 慢启动( slow start), 用于防止因特网的突然过载和拥塞。
      由于存在这种拥塞控制特性, 所以新连接的传输速度会比已经交换过一定量数据的、“ 已调谐” 连接慢一些。

    HTTP连接的处理
    • 并行连接
        试想,当浏览器加载一个页面时,如果一个个HTTP请求都串行执行,那显示出这个页面将会奇慢无比。
      实际上,浏览器确实使用了并行连接,但它们会将并行连接的总数限制为一个较小的值(通常是4个)。之前看baidu的webuploader的设计文档,经过测试,当文件分片上传时,建议开始的线程为3个。

    • 持久连接
        HTTP/1.1(以及 HTTP/1.0 的各种增强版本)允许 HTTP 设备在事务处理结束之后将 TCP 连接保持在打开状态, 以便为未来的 HTTP 请求重用现存的连接。 在事务处理结束之后仍然保持在打开状态的 TCP 连接被称为持久连接。 非持久连接会在每个事务结束之后关闭。持久连接会在不同事务之间保持打开状态, 直到客户端或服务器决定将其关闭为止。
        持久连接降低了时延和连接建立的开销,将连接保持在已调谐状态, 而且减少了打开连接的潜在数量。

    HTTP 1.1

    • 虽然 HTTP1.1 默认是开启 Keep-Alive 长连接的,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点,但是依然存在 head of line blocking,如果出现一个较差的网络请求,会影响后续的网络请求。为什么呢?如果你发出1、2、3 三个网络请求,那么 Response 的顺序 2、3 要在第一个网络请求之后,以此类推
    • 针对同一域名,在请求较多的情况下,HTTP1.1 会开辟多个连接,据说浏览器一般是6-8 个,较多连接也会导致延迟增大,资源消耗等问题
    • HTTP1.1 不安全,可能存在被篡改、被窃听、被伪装等问题。当然,前阵子 Apple 推广 HTTPS 的时候,相信很多人已经接入 HTTPS
    • HTTP 的头部没有压缩,header 的大小也是传输的负担,带来更多的流量消耗和传输延迟。并且很多 header 是相同的,重复传输是没有必要的。
    • 服务端无法主动推送资源到客户端
    • HTTP1.1的格式是文本格式,基于文本做一些扩展、优化相对比较困难,但是文本格式易于阅读和调试,但HTTPS之后,也变成二进制格式了,这个优势也不复存在

    HTTP2.0

    在 HTTP2.0中,上面的问题几乎都不存在了。HTTP2.0 的设计来源于 Google 的 SPDY 协议,如果对 SPDY 协议不了解的话,也可以先对 SPDY 进行了解,不过这不影响继续阅读本文

    • HTTP 2.0 使用新的二进制格式:基本的协议单位是帧,每个帧都有不同的类型和用途,规范中定义了10种不同的帧。例如,报头(HEADERS)和数据(DATA)帧组成了基本的HTTP 请求和响应;其他帧例如 设置(SETTINGS),窗口更新(WINDOW_UPDATE), 和推送承诺(PUSH_PROMISE)是用来实现HTTP/2的其他功能。那些请求和响应的帧数据通过流来进行数据交换。新的二进制格式是流量控制、优先级、server push等功能的基础

      流(Stream):一个Stream是包含一条或多条信息、ID和优先级的双向通道
      消息(Message):消息由帧组成
      帧(Frame):帧有不同的类型,并且是混合的。他们通过stream id被重新组装进消息中

    • 多路复用:也就是连接共享,刚才说到 HTTP1.1的 head of line blocking,那么在多路复用的情况下,blocking 已经不存在了。每个连接中 可以包含多个流,而每个流中交错包含着来自两端的帧。也就是说同一个连接中是来自不同流的数据包混合在一起,如下图所示,每一块代表帧,而相同颜色块来自同一个流,每个流都有自己的 ID,在接收端会根据 ID 进行重装组合,就是通过这样一种方式来实现多路复用。


      1493090476519843.png
    • 单一连接:刚才也说到 1.1 在请求多的时候,会开启6-8个连接,而 HTTP2 只会开启一个连接,这样就减少握手带来的延迟。

    • 头部压缩:HTTP2.0 通过 HPACK 格式来压缩头部,使用了哈夫曼编码压缩、索引表来对头部大小做优化。索引表是把字符串和数字之间做一个匹配,比如method: GET对应索引表中的2,那么如果之前发送过这个值是,就会缓存起来,之后使用时发现之前发送过该Header字段,并且值相同,就会沿用之前的索引来指代那个Header值。

    • Server Push:就是服务端可以主动推送一些东西给客户端,也被称为缓存推送。推送的资源可以备客户端日后之需,需要的时候直接拿出来用,提升了速率。具体的实验可以参考这里:iOS HTTP/2 Server Push 探索

    Socket

    Socket原理

    套接字(socket)

    套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

    应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

    建立socket连接

    建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket ;

    套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

    • 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
    • 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
    • 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

    SOCKET连接与TCP连接
    创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

    Socket连接与HTTP连接

    由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

    而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

    很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

    区别简述:
    1)http是一种协议,socket是一种编程接口,主要包括TCP协议和UDP协议;
    2)http和TCP/UDP是两个不同层上的的协议。http是应用层的协议,TCP/UDP是传输层的协议,http是在TCP/UDP之上的协议,http协议使用了TCP/UDP,http更加高级一点但是没有很好的灵活性。也就是http使用起来比TCP/UDP要简单,只需要遵循规范就可以进行网络通信了。

    相关文章

      网友评论

        本文标题:HTTP & Socket

        本文链接:https://www.haomeiwen.com/subject/rzyrtxtx.html