计算机网络协议不包括什么(计算机网络协议)
比如现在要实现这样一个需求,将一个数据包从A主机传输到B主机。
传输的中间过程中可能发生以下问题:
为了更清楚的解决这些问题,就需要进行分层。
1、网络分层业内普遍的分层方式有两种:OSI七层模型 和tcp/IP四层模型。
2、一个HTTP请求的分层解析流程
二、HTTP协议
超文本传输协议(HyperText Transfer Protocol, HTTP):一种无状态的(不会存储用户的信息),以请求/应答方式的协议,它使用可拓展的语义(头部添加参数)和字描述消息格式(文本、音视频),与基于网络的超文本信息系统(HTML)灵活的互动。
HTTP中虽然有传输,但是真正的传输是交由TCP来完成的。
2.1 HTTP报文格式
HTTP协议的请求报文和响应报文的结构基本相同,由三大部分组成:
- 起始行(start line):描述请求或响应的基本信息
- 头部字段集合(header):使用key-value形式更详细的说明报文
- 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据
2.2 请求报文格式
- 请求方法:如GET/HEAD/PUT/POST,表示对资源的操作;
- 请求目标:通常是一个URI,标记了请求方法要操作的资源;
- 版本号:表示报文使用的HTTP协议版本。
2.3 响应行报文格式
2.4 HTTP头字段
头部字段是key-value的形式,key和value之间用“:”分隔,最后用CRLF换行表示字段结束。比如前后端分离是经常遇到要与后端协商传输数据的类型“Content-type:application/json”,这里key就是“Content-type”,value就是“:application/json”。HTTP头字段非常灵活,不仅可以使用标准的Host、Connection等已有头,也可以任意添加自定义头,这就给HTTP协议带来了无限的拓展可能。
头字段注意事项:
- 字段名不区分大小写,字段里不允许出现空格,可以使用连字符“-”,但不能使用下划线“” (有的服务器不会解析带""的头字段)。字段名后面必须紧接着:“:”,不能有空格,而“:”后的字段值可以有多个空格;
- 字段的顺序是没有意义的,可以任意排列不影响语义;
- 字段原则上不能重复,除非这个字段本身的语义允许,例如Set-Cookie。
2.5 常用头字段
HTTP协议中有非常多的头字段,但基本上可以分为四大类:
- 请求字段:请求头中的头字段,如Host,Referer;
- 响应字段:响应头中的头字段,如Server,Date;
- 通用字段:在请求头和响应头里都可以出现,如Content-type,Connection。
当用户在浏览器输入网址回车之后,网络协议都做了哪些工作呢?
1、首先干活的是浏览器应用程序,它要解析出URL中的域名
2、根据域名获取对应的IP地址,首先从浏览器缓存中查看,如下可以查看浏览器中域名对应IP的解析
chrome://net-internals/#events
如果没有从本机域名解析文件hosts(/etc/hosts)中查看,还没有则从LDNS(Localdnsserver)、RootServer域名服务器、国际顶级域名服务商的DNS的层层解析
3、拿到IP地址之后,浏览器就可以发起与服务器的三次握手
4、握手建立之后,就开始组装http请求报文,发送报文
5、服务器收到请求报文之后开始,请求报文解析,生成相应数据,发送相应数据
6、浏览器收到响应之后,开始渲染页面
四、TCP协议
TCP(Transmission Control Protocol):面向连接的、可靠的、基于字节流的传输层通信协议。
特点:
- 基于连接的:数据传输之前需要建立连接
- 全双工的:双向传输
- 字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
- 流量缓冲:解决双方处理能力的不匹配
- 可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
- 拥塞控制:防止网络出现恶性拥塞
报文:
4.1 TCP连接管理
1、TCP连接:四元组【原地址,源端口,目的地址,目的端口】
2、确立连接:TCP三次握手(基于报文实现)
- 同步通信双方初始化序号(INS,initial sequence number)
- 协商TCP通信参数(MESS,窗口信息,指定校验和算法)
4.2 TCP三次握手详解
TCP是属于网络分层中的运输层(有的书也翻译为传输层),因为OSI分为7层,感觉太麻烦了,所以分为四层就好了,简单。
分层以及每层的协议,TCP是属于运输层(有的书也翻译为传输层)。
要想简单了解TCP三次握手,我们首先要了解TCP头部结构,如下:
TCP三次握手如图:
第一次握手
客户端给服务器发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequence number = J)。
SYN是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接
第二次握手
服务器返回客户端 SYN ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包), 该段中包含服务器的初始序列号(Sequence number = K);同时使 Acknowledgment number = J 1来表示确认已收到客户端的 SYN段(Sequence number = J)。
ACK 是“确认”的缩写。 ACK 数据包是任何确认收到一条消息或一系列数据包的 TCP 数据包
第三次握手
客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包), 该段中使 Acknowledgment number = K 1来表示确认已收到服务器的 SYN段(Sequence number = K)。
4.3 握手过程中的内核
4.4 TCP四次挥手
客户端:发送FIN数据包,代表客户端不再发送数据(但是服务端还是可以收数据的)
服务端:收到请求,开始应答,避免了A重新发送FIN重试(应答机制)
服务端:处理完数据之后关闭,关闭连接及发送FIN请求
客户端:收到请求后发送ACK应答,服务端可以释放连接
为什么要等到2MSL之后释放连接?
- 防止报文丢失,导致服务端重复发送FIN
- 防止滞留在网络中的报文,对新建立的连接造成数据扰乱
4.5 字节流的协议
TCP把应用交付的数据仅仅看成是一连串的无结构的字节流,TCP并不知道字节流的含义,TCP并不关心应用程序一次将多大的报文发送到TCP的缓存汇总,而是根据对方给出的窗口只和当前网络拥堵的程度来决定一个报文段应该包含多少个字节。
MSS:Max segment Size,默认536byte实际数据。
以上图说明,数据并不是一次发过去的,而是被分成了segment在TCP之间进行传输。所以传输的过程中,可能会出现很多问题:
- 有一部分可能到服务端,有一部分可能还在路由器中传输
- 过程中顺序也有可能被打乱,所以TCP要根据报文的序列号进行排序
- 如果由于传输慢,可能需要重复发送报文
- 如果TCP判断收到了重复报文,还需要去重
4.6 数据可靠性传输
停止等待协议:
重传机制:
4.7 滑动窗口协议与累计确认(延时ack)
滑动窗口大小通过tcp三次握手和对端协商,而且受网络影响:
这样只需要重新传丢失的报文,对于已经ack的就不需要再传输了。
五、HTTPS协议由于HTTP天生“明文”的特点,整个传输过程完全透明,任何人多能够在链路中截获、修改或者伪造请求/相应报文,数据不具有可信性。
因此就诞生了为安全而生的HTTPS协议。
使用HTTPS时,所有的HTTP请求和相应在发送到网络之前,都要进行加密。
HTTPS没有对HTTP进行直接修改,而是提供了一些API,使得HTTP不再直接与TCP进行交互,而是与SSL/TSL(安全层)先交互(进行数据加密),而SSL/TSL再与TCP层进行交互。反过来,服务端到客户端也是一样,到达之前要先经过SSL/TSL进行解密。
5.1 SSL/TSL
SSL即安全套接层(Secure Sockets Layer),有网景公司与1994年发明,IEFT在1999年把它改名为TLS(传输层安全,Transport Layer Security),正式标准化,到今天TSL已经发展出了主流的三个版本,分别是2006年的1.1、2008年的1.2、2018年的1.3,每个新版本都紧跟着密码学的发展和互联网的现状,持续强化安全和性能,已经成为了信息安全领域中的权威标准。
摘要算法
摘要算法能够把任意长度的数据压缩成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。任意微小的数据差异,都可以生成完全不同的摘要。所以可以通过把明文信息的摘要和明文一起加密进行传输,数据传输到对方之后再进行解密,重新对数据进行摘要,再比对就能发现数据有没有被篡改。这样就保证了数据的完整性。
加密算法
对称秘钥加密算法
编、解码使用相同秘钥的算法,如(AES,RC4,ChaCha20)。
比如对原密码进行一些亦或运算,需要有一个秘钥,然后用原密码和秘钥进行亦或运算进行加密和解密。
非对称秘钥加密算法
他有两个秘钥,一个叫“公钥”,一个叫“私钥”。两个秘钥是不同的,公钥可以公开给任何人使用,而私钥必须要严格保密。非对称加密可以解决“秘钥交换”的问题。网站秘密保管私钥,在网上任意分发公钥,你想要登录网站只要用公钥加密就行了。密文只能有私钥持有者才能解密。而黑客因为没有私钥,所以就无法破解密文。非对称秘钥加密系统通常需要大量的数学运算,比较慢。如DH、DSA、RSA、ECC。
使用公钥加密,就需要使用私钥解密。
使用私钥加密,就需要使用公钥解密。
TLS里使用的是混合加密方式,即把对称加密和非对称加密结合起来,两者互相取长补短,即能高效的加密解密,又能安全地进行秘钥交换。大致流程如下:
1、通信开始的时候使用非对称算法如RSA,ECDHE先解决秘钥交换的问题;
2、用随机数产生对称算法使用的“会话秘钥”,再使用公钥加密。会话秘钥很短,所以即便使用非对称加密算法也可以很快的完成加解密。
3、对方拿到密文后用私钥解密,取出会话秘钥。完成对称秘钥的安全交换,后续就使用对称算法完成数据交换。
5.2 身份验证
数字证书组成
CA信息,公钥用户信息,公钥,权威机构的签名,有效期。
数字证书作用
- 通过数字证书向浏览器证明身份
- 数字证书里包含了公钥
建立TCP三次握手的前提是客户端要拿到服务器的IP地址,如果在获取的过程中被别人截获了DNS的信息,然后故意将DNS的IP地址故意指向到黑客自己的服务器,这样就会伪装成你客户端要访问的那台服务器。这时候客户端就会将数据直接发送到黑客的服务器上,而不是目标DNS服务器。所以一定要验证目标服务器是准确的,而不是被人伪装的服务器。
没有数字证书,黑客会拦截TCP三次握手,让服务器直接将数据发送到黑客自己的服务器上。
数字证书的申请和验证
如何申请
- 生成自己的公钥和私钥,服务器自己保留私钥
- 向CA机构提交公钥,公司,域名信息等认证
- CA机构通过线上,线下等多种途径验证你提交信息的真实性、合法性
- 信息审核通过,CA机构则会向你签发认证的数字证书,包含了公钥、组织信息、CA信息、有效时间、证书序列号,同时生成一个签名;
签名步骤:hash(你用户申请证书锁提交的明文信息)= 信息摘要;CA再使用私钥对信息摘要进行加密,密文就是证书的数字签名。
浏览器如何验证
有了CA签名过的数字证书,当浏览器访问服务器时,服务器会返回数字证书给浏览器。浏览器收到证书后会对数字证书进行验证。
首先浏览器读取证书中相关的明文信息,采用CA签名时相同的hash函数计算得到信息摘要A,再利用对应的CA公钥解密数字签名数据得到信息摘要B,如果摘要A和只要B一致,则可以确认证书是合法的。
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com