应用层通过套接字使用传输层的服务。
笔记:《计算机网络 - 自顶向下(第七版)》
套接字
网络中两个应用程序的通信实际上是进程之间的通信。
- 进程通过一个称为 ** 套接字 socket** 的软件接口向网络发送报文或者从网络接收报文。
- 进程比作房子,套接字就是房门。一个进程与另一进程通信,把报文推出门,通过有运输功能的设施把报文传送到目的进程的门口,然后目的主机的进程通过进程的门(套接字)处理报文。
套接字就是应用程序(进程)和运输层协议之间的接口。
应用程序开发者可以控制套接字在应用层端的一切,但是开发者对该套接字的运输端几乎没有控制权。
安全套接字层
SSL,不是与 TCP 和 UDP 同一层次的第三种运输协议,只是对 TCP 的加强,强化是在应用层上实现的。
例如,一个应用程序要使用 SSL 服务时,需要在应用程序的客户端 & 服务器端同时使用 SSL 代码。
SSL 有专门的套接字:
- 发送报文的进程首先向 SSL 套接字传递明文数据
- 然后 SSL 代码加密数据,并将加密后的数据传递给 *TCP 套接字 *,发送到因特网
- 经过因特网后到达目的主机接收进程使用的 *TCP 套接字 *
- 该套接字再将加密数据传递给 SSL 解密
- 最后,SSL 将解密后的数据通过 SSL 套接字传递给接收进程
HTTP-Web 应用层协议
HTTP 客户端首先发起一个与服务器的 TCP 连接。
一旦连接建立,此客户端(浏览器)和服务器进程就可以通过各自的套接字访问 TCP。
如第一节套接字所述
- 客户端向自己的套接字接口发送 HTTP 请求报文,接收 HTTP 响应报文。
- 一旦向套接字发送了请求报文,该报文就完全脱离了客户端(浏览器)的控制,套接字将报文交由 TCP 控制。TCP 的可靠数据传输服务保证了这个请求报文可以完整地到达服务器。
- 服务器端也是如此
是否复用 TCP 连接:持续与非持续连接
客户端和服务器端可能需要长时间通信,通信的请求需要一个一个的发送,应用程序的开发者需要决定在这个客户端与服务器的通信中:
- 非持续连接:每个请求与响应使用单独的 TCP
- 持续连接:或者全部请求响应经过相同的 TCP
非持续连接:
例如,一个包含 3 个图片的 HTML 网页文档。
- 服务器是一直开着的,客户端要首先和服务器简历 TCP 连接
- 接着,客户端发送请求获得网页
- HTTP 服务器进程收到请求,封装网页发送给 TCP 套接字
- 发送完成后,HTTP 服务器进程会通知 TCP 断开此 TCP 连接(其实直到 TCP 确认客户端已经完整收到响应报文,它才会真正断开连接)。
- 客户端收到包含网页的报文后,与服务器的 TCP 连接就被关闭
- 之后的 3 张图片的请求需要重复 3 次这个过程。
一句话,每个 TCP 连接只传输一个请求报文和一个响应报文。
非持续连接缺点是:
- Web 服务器负担大。由于 TCP 连接太多,而每个 TCP 连接都需要缓冲区和变量进行维护连接,所以给 Web 服务器很大压力。
- 不必要的时延。因为建立 TCP 连接时,总需要一个 RTT 来创建 TCP,其后的一个 RTT 才是请求和接收 Web 数据。
持续连接:服务器在发送响应后,不会马上断开 TCP 连接,在后续同一客户端发送请求时,继续通过这个 TCP 连接进行传输。一般经过一定的时间未使用后,HTTP 才会关闭 TCP 连接。
往返时间:RTT
代表一个短分组从客户端到服务器端然后再返回客户端的时间。
一般三次握手的前两次所耗费的时间可以视为一个 RTT
。
客户端通常结合第三次握手,向该 TCP 连接发送一个 HTML 请求报文。一旦此请求报文到达服务器,服务器就在这个建立好的 TCP 连接上发送 HTML 文件。第三次握手和 HTML 响应报文到达客户端的事件就是另一个 RTT
。
、
HTTP2
二进制流
二进制的优势:
- 文本数据,与字符流无差别。而对于数字,二进制更节省空间。
- 图片和视频在存储时,是二进制的,使用时,转换为二进制流也更快捷。
HTTP2 相比之前的 1.X 版本,优点:
- 完全的二进制格式的数据传输,而 1.X 默认为文本格式。一般来说,相同的内容量,二进制流比文本流使用更少的字节既可以实现传输。
- 版本 2 使用 TCP 多路复用 ** 来降低网络请求连接建立和关闭的开销,多个请求可以通过一个 TCP 连接 ** 并行完成 *。多路复用是传输层完成的,而 1.X 的 keep-alive 是在应用层的连接复用,而且是 * 串行的 **,就是说,一个文件通过这个 TCP 连接传输完成后,下个文件才能开始复用这个连接。TCP 多路复用 ** 可以让不同文件的传输帧在一个 TCP 连接中一起同时进行流式传输。
- 版本 2 支持传输流的优先级和流量控制机制。例如,服务器可以直接设置,HTML 和 CSS 优先级高,而 JS 脚本优先级低,这样 JS 就可以不用写在 HTML 底部了。
- 支持服务器推送。服务器主动把资源推送给客户端。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。