您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 网络/安全 > 正文

被搞得晕头转向的HTTP和TCP

发表于:2022-11-02 作者:指北君 来源:Java技术指北

哈喽,大家好,我是指北君。话不多说,先来个小能量。

有些路看起来很近走去却很远,缺少耐心永远走不到头。——沈从文

接下来就开始指北君的分享~

前言

对于从事互联网开发的同学来说,永远都无法绕过网络连接,各种原理、各种协议...轻轻松松就被搞得晕头转向,不知所措,从而影响解决问题的效率,同时需要投入大量时间去查阅资料,搞不好还会搞丢自己的绩效...想想后果就不禁一颤,那不如提前储备,以备不时之需。

本篇内容主要围绕常见的HTTP内容,同时对比TCP进行梳理,接下来就和小编一起去探索网络连接那些事!

网络小知识​

分析网络连接前,需要给大家简介下网络知识,了解的同学可以直接跳过

  • 网络模型通常分为四层或七层,小编以七层为例,网络自下而上分层为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。每一层都依赖于其底层的协议,比如没有网络层,就不会有传输层。
  • HTTP协议对应网络的应用层,TCP协议对应网络的传输层。(多提一句,IP协议对应网络层,socket是基于TCP/IP协议封装的应用接口,便于开发人员使用)
  • TCP协议主要作用是如何稳定快速的传输数据,而HTTP协议负责定义数据,以便网络两端的计算机理解数据。

HTTP协议

  • HTTP协议全名超文本传送协议(Hypertext Transfer Protocol),是web联网的基础,也是移动端常用协议之一。
  • HTTP协议属于应用层,主要作用于两台连接的计算机,并且在不同计算机中充当着客户端和服务器的角色。客户端发起请求,服务器负责给予请求对应的响应,完成数据交互。
  • HTTP属于无状态协议,每一次请求都是互相独立的、没有任何关联的。在1.0版本中,客户端每次请求都是建立一次单独的连接,请求完成后自动释放,1.1版本中单连接允许处理多个请求,并且多个请求可以并发执行。(后续会单独详细介绍HTTP,敬请期待)
  • 由于HTTP每次请求结束后会释放连接,所以被称为‘短链接’。为了保持客户端的在线状态,需要不断向服务器发起连接请求,根据服务器的响应结果判断连接是否断开。

TCP协议​

  • TCP全名传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议,是移动端建立无线网络连接的基础,实现移动联网
  • TCP相对于HTTP发起请求、接收响应、释放连接来说,是更加复杂的。最常见且最重要的就是‘三次握手’:
  • 第一次握手:client发送SYN包(syn=j)到server,并进入SYN_SEND状态开始等待;
  • 第二次握手:server接收并确认client的SYN包(ack=j+1),同时也额外发送SYN包(syn=k),即SYN包+ACK包,此时server进入SYN_RECV状态;
  • 第三次握手:client收到server的SYN+ACK包后,向server发送ACK包(ack=k+1),成功后client和server分别进入ESTABLISHED状态,完成三次握手。
  • TCP还有另外一层容易被忽略的就是断开连接(四次挥手)
  • 第一次挥手:client端接收完数据,会向server端发起释放请求(fin=m);
  • 第二次挥手:server端接收并确认client的释放请求(ack=m+1),通知应用层要释放TCP连接,并进入CLOSE_WAIT状态;
  • 第三次挥手:server端如果还有没有发送完的数据,会继续发送,直到发送完毕后会向client端发送连接释放请求(fin=n),然后进入到LAST_ACK状态;(此处可以将第二次和第三次合并,延迟ACK包的发送,用来解决传输时间限制等问题)
  • 第四次挥手:client端接受并确认server的释放请求(ack=n+1)后,进入TIME_WAIT状态,并持续2MSL时间,若该时间内未收到server端的重发请求,就会进入CLOSE状态,并向server发送fin+ack包,server端确认接收后,也进入CLOSE状态。

实际应用

小编最近遇到的一个十分紧急的问题,就是外网的页面资源加载延迟高,特别是图片、js等静态资源。由此为出发点,优先解决静态资源加载,想到了HTTP缓存这一特性。

  • HTTP缓存:当浏览器访问服务端时,会将请求资源缓存到本地,当下次再发起相同请求,则直接加载本地缓存资源,不再请求服务端,节省网络资源。
  • HTTP缓存是由请求头字段(Cache-Control)控制。具体根据资源更新频率设置缓存时长。
  • 参考微信使用HTTP缓存(仅供参考):

html:public, max-age=500 (public为公共缓存,max-age为缓存时间500秒)

JS文件:max-age=31536000(1年),文件命名带版本号或指纹信息,方便及时更新。

CSS文件:max-age=31536000,文件命名带版本号或指纹信息,方便及时更新。

图片:max-age=31536000,文件命名带版本号或指纹信息,方便及时更新。

XHR请求:no-cache,must-revalidate

最终小编利用HTTP缓存解决了页面加载问题,主要是参考微信的请求参数设置,后续涉及其它web资源优化本文不再作详细介绍,如果有其它问题可以私信一起探讨。

总结

TCP协议对应传输层,HTTP协议对应应用层,二者在本质上其实没有可比性,但实际应用中出现问题很容易混淆,并且不容易定位问题,在此按自身理解分享给大家。

HTTP协议是基于TCP协议的,HTTP在发起请求时通过TCP建立起连接服务器的通道,当请求结束后,会立即断开TCP连接。

最后借用比较形象的比喻:HTTP是轿车,是封装或显示数据的具体形式;将TCP封装的API(即Socket编程接口),是发动机,提供了网络通信能力。