另可参考: http://www.stevenwash.xin/2018/04/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/
1、应用层的协议,默认使用的端口是80
2、HTTP是面向无连接、无状态的
3、HTTP报文分为请求报文和响应报文
4、HTTP报文都包含了首行、头部、主体
5、请求报文首行:方法、URL和HTTP版本
响应报文首行:HTTP版本、状态码和简要描述
6、头部:包含一些键值对属性,用:分隔
7、请求报文主体:POST方法的则在主体中带有参数信息
响应报文主体:服务器将要响应的内容
8、请求的方法主要有:GET、POST、PUT、HEAD、DELETE
9、响应报文中的状态码:
1xx : 信息性的状态码
2xx : 表示的是响应成功的状态码,如200
3xx : 重定向状态码,比如301
4xx : 客户端错误的状态码
5xx : 服务端错误的状态码
常见的几种状态码:
200 : 响应成功
304 : 自从上次请求之后,请求的网页未修改过,服务器返回此状态码的时候不会返回网页内容
401 : 未授权,请求身份认证
403 : 服务器拒绝请求
404 : 服务器找不到请求的网页
1、HTTP运行在TCP的基础之上,以明文的方式传输内容,不会进行任何的数据加密;HTTPS则是HTTP的安全版本,是将HTTP运行在SSL/TLS之上,所有的传输内容都经过了加密。
2、两者使用的是完全不同的连接方式,比如它们连接的端口号就不一样,HTTP是80,HTTPS是443
3、HTTP连接简单,没有状态;HTTPS则是有SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要安全很多
4、HTTPS协议需要到CA(数字认证机构)申请证书,可能需要一定的费用
加密和解密使用相同的密文:
A经过加密的密文加密之后成为C,然后将会C传给用户B,B拿到结果C之后再使用和A加密一样的密钥来进行解密就可以得到正确的内容了。
应用:DES、3DES、AES、RC5、RC6
每个人有一对密码<私钥,公钥>,信息被某个人的公钥加密之后,只能用这个人的私钥进行解密,同样,被私钥加密之后也需要相应的公钥解密。这就可以实现两个人传输信息的安全了,比如:
A和B发送消息msg,此时因为B的公钥是公开的,所以大家都知道,此时A可以用B的公钥将msg进行加密,然后发给B,因为B的密钥是只有B一个人知道,所以,别人即时截获了A加密后的内容,没有密钥也是无法在有限时间内解开的。B收到加密之后的信信之后,只需要用自己的私钥进行解密即可,给A发消息也是如此。
应用:RSA、DSA/DSS、SSH、HTTPS、TLS、电子证书、电子签名等
使用了非对称加密、对称加密和HASH算法。
1、首先浏览器将自己支持的一套加密规则发送给服务端
2、服务端收到之后从中选出一组加密算法和HASH算法,并将自己的身份信息以证书的方式发送给浏览器(证书包含网站地址、加密的公钥、过期时间等)
3、浏览器获得网站证书之后:
a、验证证书的合法性,就是各种信息是不是合法的,如果证书不受信,则会提示
b、如果证书受信,浏览器就会生成一串随机数的密码,并用证书中提供的公钥进行加密
c、使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有的信息发送给网站
4、网站接收到浏览器的数据之后:
a、使用自己的私钥进行解密,获得随机生成的密码,使用密码解密浏览器发送过来的握手信息,并验证HASH是否与浏览器发送来的一致
b、然后网站使用浏览器发送来的密码加密一段握手消息,发送给浏览器
5、浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,则此时握手过程结束
6、在此之后,所有的通信数据由之前浏览器生成的随机密码并利用对称加密算法进行加密
通过以下机制:
1、确认重传:接收方接收到数据之后就会进行发送确认收到的消息,发送方一段时间没有收到确认就会进行重传
2、数据校验:每次数据的发送,发送方都会计算验证信息,并且添加到发送的信息的包里面,然后接受方接收到信息之后就会进行验证信息在发送的过程是否被修改过
3、对接收方接收到的失序的数据包进行重新排序(在进行数据的合理分片的时候,接收到分片数据之后需要重新组合)
4、流量控制:当接收方来不及处理传输过来的数据的时候,会发送提示信息给发方,让发送方降低发送的速率,这样就可以避免包丢失
5、拥塞控制:当网络发生拥塞的时候,减少数据的发送
两个序号:ack、seq
三个标志位:ACK,SYN,FIN
1、由客户端发起,发送一个带SYN标记的TCP报文到服务器(ACK=0,SYN=1,seq=x)
2、服务器接收之后,回复一个带有ACK和SYN标志的,表示对刚才收到的报文的回应,同时用SYN来询问客户端是否准备好接收数据了(ACK=1,SYN=1,ack=x+1,seq=y)
3、客户端接收到ACK和SYN之后,会再给服务器回复一下,表示可以开始接受数据了(ACK=1,SYN=1,ack=y+1,seq=x+1)
NOTE : 造成DDOS攻击中的SYN Flood攻击
可以有客户端和服务端来进行终止连接。
1、TCP客户端发送一个终止信号FIN给服务端,用来提示服务端关闭数据传输(ACK=1,FIN=1,seq=u)
2、服务端收到FIN之后,会返回给客户端一个ACK,确认序号为收到的序号加一(ACK=1,seq=v,ack=u+1)
3、经过CLOSE_WAIT的时间之后,服务端再发送一个FIN给客户端,表示关闭客户端连接
4、客户端发送ACK进行确认
1、首先解释窗口,是指发送方和接收方最大可以发送和接受的数据量,也就是自己的数据接收缓冲区的大小
2、滑动的意思,是指,在消息发送的过程中,这个窗口的大小(即缓冲区的大小)是可以发生变化的,当窗口的大小发生变化的时候应该给对方发送窗口大小的通知
发送窗口中消息的几个概念:
1、已发送并且收到确认的数据
2、已发送但是没有收到确认的数据
3、允许发送但是尚未发送的数据
4、发送窗口外,发送缓冲区内暂时不允许发送的数据
过程:
1、A为发送方,发送窗口大小为20,B为接收方,接收窗口的大小为20
2、首先A将这个20个分为seg1,seg2,seg3,seg4进行发送,此时B接收到了seg1,seg2,seg4
3、然后B就会给A回复,seg1和seg2已经收到了,此时接收方会丢弃seg1,seg2(以为已经接受到了),然后回将seg4就行缓存,因为还差一个seg3
4、然后A收到B的确认消息之后,就会将seg1,seg2当做已经接收了,然后假设此时的窗口大小不变,就会将当前的发送方的窗口向右移动,将之前在发送窗口外的数据包含在了发送窗口中
5、然后A在一定的时间之后就会进行重传,此时假设B接收到了A重传过来的seg3,然后并且被上层应用程序接收了,然后就会回复seg3,seg4接受到了,否则会将seg3和seg4都丢弃掉
Special:有一点要注意的就是,在每次发送数据的时候,窗口的大小是动态变化的。这样是可以做到流量控制的。
对资源的需求超过了可用资源,比如同时进入网络中的数据量非常大,需要很大带宽来进行数据的传输,但是实际情况是可以用的带宽资源不够,导致数据传输进行了拥塞,则会严重的降低网络的吞吐量。
防止过多的数据进入到网络中,这样就可以使得网络中的路由器或者链路不至于过载。拥塞控制是一个全局性的过程,这会涉及到所有的主机、路由器、以及与降低网络传输性能的所有的因素。
慢开始、拥塞避免、快重传、快恢复
慢开始的意思是指开始的起点cwnd = 1,但是后续的增加是呈指数增长的。当拥塞窗口的大小不断增加达到设置的ssthresh门限值的时候,慢开始算法就结束了。
接着就是拥塞避免算法,这个就是从当前的ssthesh(假设是16)的位置开始,将指数增长改为线性增长,即每经历一个rrt就会增加一个MSS。这个时候的增长速度就会变得非常的缓慢了。
如果在增长的过程中,发生了网络拥塞(即没有按时收到发出去的报文的确认消息),此时cwnd=24(可以体现为网络的反应时间超时了),此时就会将cwnd设置为1,并且将ssthesh的值设置为当前发生拥塞的cwnd的值的一半,即ssthesh=12,然后继续进行慢开始和拥塞避免算法。
在上面描述的算法中,当发生网络拥塞了,可以将cwnd设置为1重新开始慢开始和拥塞避免算法。这个方式实际上是之前的一种方式,TCP Tahoe版本,现在基本上已经弃用了。
当接收方接收到了M1,M2,M4的时候,收到M1和M2都会立即确认,但是没有收到M3,此时M4来了,此时根据快速重传的规定(实际上,仅仅根据可靠传输来判断的话,此时接收方是可以什么都不做的,即将M4进行缓存起来,然后在有限的时间里等M3的到来),接收方在收到了乱序的M4之后,应该立即向发送方发送对M2的重复确认(之前已经确认过一次了,这样做的目的是告诉发送方,接收方没有接收到M3)。此时接收方接着发送M5,M6,接收方接收到这个两个报文之后,也还要再重复确认M2(即又重复确认了两次),此时发送方接收到了4次对M2的确认,其中后面的三个都是重复确认。
此时,在快重传算法中规定,发送方只要连着收到了三个重复确认,就要立即重传重复确认报文的下一报文,也就是上面说的M3报文,而不用等待重传计时器到时,这样会提高网络的吞吐率。
在上面的描述中,在发送方连续接受到三个重复确认,除了上面说的立即重传M3之外,还会进行快恢复。
首先,将门限ssthesh设置为当前发生拥堵的cwnd(24)的一半值,即ssthesh=12,然后让cwnd=12(此时的cwnd的值不是设置为1)。此处就是区别老版本的地方,这个时候快速恢复没有将cwnd设置为从1开始,而是设置为更新之后的ssthesh=12的值,然后再根据拥塞避免算法进行,此次拥塞窗口cwnd的值就线性增大,即达到快恢复的目的。
主要体现域名转化为IP和TCP的三次握手的过程:
1、首先将域名转化为IP
a、搜索本地的DNS缓存
b、搜索操作系统的DNS缓存
c、搜索hosts文件中的配置信息
d、递归搜索域名服务器中的DNS信息
2、得到IP地址之后,发起TCP/IP的三次握手请求
3、在于服务器建立连接之后,由浏览器发送一个HTTP请求
4、经由路由器到服务器的防火墙,再到服务器
5、服务器接收到请求之后进行相关的处理(比如身份验证等),然后会返回一个html文件
6、返回的HTML文件经过相同的过程,返回到浏览器端
7、浏览器进行解析和渲染,但是在一个HTML文件中可能还包含了很多其他的请求(外部的js,图片资源等),此时要重复上面的过程加载相应的资源信息
首先,两者都是应用在传输层。(IP协议应用在网络层,HTTP协议应用在应用层)
1、面向连接的传输层协议
2、TCP是全双工通信
3、只能是点对点通信
4、TCP面向字节流传输
5、TCP提供安全交付的功能
6、TCP的头部至少20个字节
1、面向无连接的传输层协议
2、支持一对多、一对一、多对多、多对一的交互通信
3、面向用户数据报文,没有拥塞控制,适合用来进行多媒体通信
4、尽最大努力交付,但是不保证安全交付
5、UDP的头部开销很小,只有8个字节
分为请求报文和响应报文,都包含首行、头部、主体
请求报文:
1、首行:请求的方法、请求的URL、请求的HTTP的版本号
2、头部:就是一堆键值对,比如有:Accept、Accept-Language、Content-Type、Cookie、Host等
3、主体:就是请求的消息的主体的内容
响应报文:
1、首行:HTTP的协议版本号、状态码和简要描述
2、响应头:也是键值对,比如有:Server、Content-Type、Date等信息
3、响应的主体:就是由服务器返回的内容
HTTP的状态码:
1xx : 信息性的状态码
2xx : 表示的是响应成功的状态码,如200
3xx : 重定向状态码,比如301
4xx : 客户端错误的状态码
5xx : 服务端错误的状态码
常见的几种状态码:
200 : 响应成功
301 : 自动重定向
304 : 自从上次请求之后,请求的网页未修改过,服务器返回此状态码的时候不会返回网页内容
401 : 未授权,请求身份认证
403 : 服务器拒绝请求
404 : 服务器找不到请求的网页
1、Get请求的数据会依附在URL之后,通过?进行分隔,然后参数之间用&进行连接,而Post则是把提交的数据放置在HTTP包的包体中
2、在提交数据上,GET的数据量会有一定的限制(这个限制不是来自于HTTP协议,而是来自于浏览器对URL的长度有限制),在使用POST的时,理论上是没有限制的。
3、POST比GET的请求安全性更高,比如GET请求的参数会显示在链接上,还可能会被使用Cross-site request forgery(XSS攻击)
在HTTP1.0中默认是短连接,在HTTP1.1中默认的是长连接,通过在响应头中添加:
Connection:keep-alive
建立长连接之后,如果客户端之后再次访问这个服务器的时候,就会继续使用这条已经建立的连接了。但是keep-alive并不会一直保持链接,可以在服务器端设置保持时间。
HTTP协议的长连接和短连接实际上是TCP协议的长链接和短连接。
原本是基于SPDY协议设计的,与SPDY的不同之处:
1、HTTP2.0是支持HTTP的明文传输的,儿SPDY则强制使用的是HTTPS传输
2、在HTTP2.0中的消息头压缩使用HPACK算法(效率更好),SPDY使用的是DEFLATE算法
新特性:
1、解析采用了二进制的形式,克服了之前基于文本的解析
2、多路复用技术:将多个request进行共享连接,根据request的id进行分类
3、将header中的信息进行了压缩(HPACK压缩算法),并且通信的双方都留有一份header 属性表,避免重复header的传输
4、还具有Server Push的功能,能主动将一些资源推送到浏览器
1、采用多路复用降低延迟(多个请求共享一个TCP连接)
2、header的压缩(在之前的HTTP1.x中的header中有很多数据是冗余的,所以采用合适的压缩算法压缩头部)
3、设置请求优先级(由采用多路复用带来的问题:会导致有一些关键性的请求被阻塞了,SPDY允许给每一个request设置一个优先级,这样可以让优先级高的请求优先被处理)
4、基于HTTPS的加密传输协议
5、服务端推送(假设一个页面有三个资源index.html,index.css,index.js,当浏览器请求index.html的时候,按照之前的做法,是先请求请index.html,然后递归遍历在index.html这个文件中的新的请求,然后一次再发一次tcp请求,这样会额外产生一些性能消耗。Server Push的作用是当浏览器请求index.html的时候,服务器将index.css和index.js也主动推送给浏览器,并且缓存起来,这样的话,当接下来浏览器请求index.css和index.js的时候就会直接在缓存中取,而不用发请求了)
Note: SPDY是建立在HTTP之下,TCP和SSL之上的:
HTTP -> SPDY -> SSL -> TCP