TCP/IP 协议族是一组协议的集合,也叫互联网协议族,计算机之间只有遵守这些规则,才能进行通信。TCP 和 IP 只是其中2个重要的协议,所以用 TCP/IP 来命名这个互联网协议族,实际上他大致包括四层协议。
上文说过 TCP/IP 宏观上分为四层,接下来说下四层的具体作用。
应用层 为用户直接提供不同的网络服务协议,比如 HTTP、Email、FTP 等,这些协议都是为了解决实际生活中不同的需求而产生的协议。用户大部分时间也是在此层操作跟组装数据,说白了就是socket
编程!至于具体的数据是如何进行网络传输的,是由下面的三层负责的。
传输层为应用层提供通信服务,属于面向通信部分的最高层,也是用户功能中的最底层。传输层为相互通信的应用进程提供了逻辑通信。主要包括 TCP
协议和 UDP
协议。
传输层的作用:
网络层功能是实现数据包的选路和转发。广域网通常使用众多分级的路由器来连接分散的主机或局域网,因此,通信的两台主机一般是通过多个中间节点路由器连接的。网络层的任务就是选择这些中间节点,以确定两台主机之间的通信路径。同时对上层协议隐藏了网络拓扑连接的细节,使得在传输层和网络应用程序看来,通信的双方是直接相连的。
IP 协议即处于这一层,提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径,並具有一定的拥塞控制和流量控制的能力。
数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输。数据链路层两个常用的协议是ARP协议(Address Resolve Protocol,地址解析协议)和 RARP 协议(ReverseAddress Resolve Protocol,逆地址解析协议)。它们实现了 IP 地址和机器物理 MAC 地址之间的相互转换。
但是需注意一点, IP 层是有 Maximum Transmission Unit 最大传输单元 MTU 限制的,同理一次数据传输时 TCP 层是有 Maximum Segment Size 最大报文段长度 MSS 限制的,
以太网的MTU是1500,基本IP首部长度为20,TCP首部是20,所以MSS的值最大可达1460(MSS不包括协议首部,只包含应用数据)。
所以一个大的应用层信息传输时候可能会被切分若干块然后逐个传输。接收方收到每个包的应用层数据再组装成应用层数据,然后一个请求才算接收完成,这也是 Content-Length 字段存在的意义。
数据分包发送
OSI
TCP/IP
OSI 跟 TCP/IP 区别
介绍完宏观的TCP/IP 协议簇后,接下来让我们从上到下进入网络的世界吧。
开车了
HyperText Transfer Protocol,又名 超文本传输协议。HTTP 是对计算机世界里任意两点之间传输文字、图片、音视频等超文本数据的约定和规范。
HTTP
URI:Uniform Resource Identifier 统一资源标志符,表示的是web上每一种可用的资源,URI只是一种概念,怎样实现无所谓,重点在于标识一个资源。
URN :Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。
URL:Universal Resource Locator 统一资源定位符,URL 其实是 URI 的一种子集,不仅标识了一个资源还告诉了你如何访问它,一个标准的URL必须包括:protocol、host、port、path。
URL模板
举例三者关系:
请求 和 响应 报文都由 起始行
、头部
、空行
、实体
四个部分组成,只不过 起始行
稍有不同。
请求报文格式
请求行又包含3个部分:请求方法、URL、协议版本。它们之间用空格分开,请求行最后以一个回车符 + 一个换行符结尾。
请求方法:表明想对目标资源进行何种操作,HTTP1.1 定义了下表中列出的 8 种请求方法,其中最常用的是 GET 和 POST。
URL:指定就是本次访问的目标地址。
协议版本:指定了客户端当前支持的 HTTP 版本,HTTP 目前通用的有 1.1、 2.0、3.0 三个版本,如果请求方指定了 1.1,应答方收到之后也会使用 HTTP 1.1 协议进行回复。
请求头部 用来告知服务器该请求和客户端本身的一些额外信息,每个请求头都是一个键值对,键和值之间用英文冒号隔开。每个请求头单独形成一行,它们的末尾都是一个回车符和换行符。在所有的请求头中,只有 Host 是必需的,其它请求头都是可选的,列举一些常见请求头:
只包含一个回车符和一个换行符,不包含其它任何内容。这个空行用于标记请求头部已结束,它是必须要有的。
一般就是用户自定义的 信息体了,在消息头中可以通过 Content-Type 指定类型。
请求样例
响应报文格式
指定返回信息对应的 HTTP 版本、响应信息状态码、简单原因。
至于空行跟消息体几乎跟跟请求类似,而消息体类型是由 Content-Type 指定的。
响应样例
HTTP 协议规定了非常多的头字段,可以实现各种各样的功能,但基本上可以分为以下四类:
通过对 HTTP 头字段的设置,HTTP 提供了如下几个重要功能:
HTTP 是明文传输的,存在如下几个风险:
SSL/TLS 为了保证安全性 HTTPS 应运而生,HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 加密协议,可以解决上述三个问题。
混合加密
实现了信息的机密性。摘要算法
的方式来实现完整性,它能够为数据生成独一无二的序列号。公钥
放入到数字证书
中,解决了冒充
的风险。这里需注意一般 HTTP 默认是 80 端口,而 HTTPS 默认 443 端口。
加密算法 分为 对称加密
跟 非对称加密
。
HTTPS 采用的是 对称加密
+ 非对称加密
= 混合加密
方式:
摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,目前可以被解密逆向的只有CRC32算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
消息摘要算法主要应用在数字签名
领域,作为对明文的摘要算法。著名的摘要算法有RSA公司的MD5算法和 SHA-1 算法及其大量的变体。
校验完整性
非对称加密时,客户端保存公钥,如何确保公钥的准确性是个难题
,如果有人窃取服务器公钥搞事情,那么整个数据传输过程中客户端跟服务器是感知不到第三方存在,但信息却早就泄露了!
非对称加密信息泄露
问题的关键就是如何保证客户端收到的是服务器的公钥!此时 数字证书就出现了,它就是基于上上面所说的私钥加密数据,公钥解密来验证其身份。
CA确保公钥正确传输
权威
的证书签发机构,全球就那么几个公司比较权威,该机构用RSA生成一对公私钥。先进行 TCP 的三次握手,然后准备加密通信,开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手 HandShake
,也就是前面一直说的SSL/TLS模块,那么它的主要工作流程是啥呢,你可以认为是 ClientHello、ServerHello、Finish。
SSL/TLS 建立流程
客户端向服务器发起加密通信请求 : 客户端给出SSL/TLS协议版本号 + 一个客户端生成的随机数
Random1
+ 客户端支持的加密方法。
服务器端确认SSL/TLS版本是否支持,确认使用的加密算法,生成随机数
Random2
(用来生成会话秘钥),生成服务器数字证书。
Random3
,用服务器公钥加密生成 PreMaster Key
然后发送给 服务器,再发送个约定的加密算法。PreMaster Key
得到 Random3
。至此服务器跟客户端都用相同的加密算法加密Random1 + Random2 + Random3 = 会话秘钥 Session Key
,以后通信就用这个了加密通信。Random3
+ 最终加密算法 最终定下 会话秘钥 Session Key
。目前 HTTP 版本分为 HTTP/1.1、HTTP/2、HTTP/3 三个版本,主流用的是前面俩。
HTTP版本对比
HTTP/1.1 相比于老版本优缺点如下:
优点:
缺点:
HTTP/2 协议是基于 HTTPS 的,做了向下兼容同时还有如下优化。
HPACK
算法,在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表中,头部来回重复信息不再发原值直接发索引号就好。缺点:
HTTP/3 把 TCP 协议改成了UDP,因为 UDP 是不管顺序、不管丢包的, 同时 Google 在 UDP 的基础上也加了 TCP 的连接管理、拥塞窗口、流量控制等机制,这套协议我们称之为 QUIC 协议。整体来说 HTTP/3 优化点如下:
QUIC
独有一套机制来保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响。HTTP 牛逼之处在于他只是规定了 header + body 的基本框架,里面具体填写啥用户可自定义,同时它的底层都是插拔式的组件,比如 SSL/TLS 的添加,二进制帧传送,UDP替换TCP等等。
不管是 TCP 还是 QUIC 都保证了 数据传输的可靠性。
HTTP 是 基于-请求 应答模型实现数据传输的。
HTTP 的每一个请求-应答都是无状态的,所以每次收发报文都是完全独立的,如果要实现一些连锁反应需要用到 Session 跟 Cookie 机制。
HTTP 只是一个在应用层规定好的传输协议而已,它的底层用的是 TCP 协议传输数据。
常见的 HTTP 状态码 有五种类型。
只大致讲解了TCP/IP协议的应用层跟传输层,网络层下篇见,看个更详细版本的 TCP/IP 协议。
TCP/IP协议