协议
以下内容摘录自肥朝大大https://www.jianshu.com/p/2cb959529c96以及https://hit-alibaba.github.io/interview/basic/network/TCP.html,侵删。
IP(Internet Protocol网际协议):网络层协议,主要是向传输层提供统一的ip分组
TCP(Transmission Control Protocol传输控制协议):传输层,面向连接的协议,主要解决数据如何在网络中传输
UDP(User Data Protocol用户数据报协议):传输层,非连接协议。ping命令就是向对方主机发送UDP数据包
HTTP(超文本传输协议):应用层协议,主要解决如何包装数据,默认端口号是80。请求-响应的模式。请求要先建立在TCP基础上。
SOCKET:本身不是协议,而是一个调用接口。只是使得程序员更方便使用TCP/IP协议栈。
TCP三次握手
what:三次握手是指建立一个TCP连接时,需要客户端和服务端之间一共发送三个包。
why:为了连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。在socket编程时,客户端执行connect()时,将触发三次握手。
how:
第一次握手(SYN=1,seq=x):
客户端发送一个TCP的SYN标志位置1的包,指明客户端打算连接的服务端的端口,以及初始序号x,保存在包头的序列号(Sequence Number)字段里。
发送完毕后,客户端进入SYN_SEND状态。
第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1):
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1。服务器端选择自己的ISN序列号,放到Seq域里,同时将确认序号(Acknowledge Number)设置为客户的ISN加1,即x+1.
发送完毕后服务端处于SYN_RCVD状态。
第三次握手(ACK=1,ACKnum=y+1):
客户端再次发送确认包(ACK),SYN标志位为0,ACK标志位为1,并且把服务器发来的ACK的序列号字段加1,放在确定字段中发给服务端。
发送完毕后,客户端进入ESTABLISHED状态,当服务器端接收到这个包时,也进入ESTABLISHED状态,此时TCP握手结束。
TCP四次挥手
what:四次挥手是指拆除连接。客户端或服务端均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可触发挥手动作。
how:
第一次挥手(FIN=1,seq=x):
假设客户端想要关闭连接,客户端发送一个FIN标志位为1的包,表示自己已经没有数据可以发送了,但是仍然可以接收数据。
发送完毕后,客户端进入FIN_WAIT_1状态。
第二次挥手(ACK=1,ACKnum=x+1):
服务端确认客户端的FIN包,发送一个确认包,表明自己接收到了客户端关闭连接的请求,但还没有准备好关闭连接。
发送完毕后,服务端进入CLOSE_WAIT状态,客户端接到这个确认包后进入FIN_WAIT_2状态,等待服务器关闭连接。
第三次挥手(FIN=1,seq=y):
服务端准备好关闭连接时,向客户端发送结束连接请求,FIN置为1。
发送完毕后,服务器进入LAST_ACK状态,等待来自客户端最后一个ACK。
第四次挥手(ACK=1,ACKnum=y+1):
客户端收到来自服务端的关闭请求,发送一个确认包,并进入TIME_WAIT状态,等待可能出现的要求重传的ACK包。
服务器端接收到这个确认包后,关闭连接,进入CLOSED状态。
客户端等待了某个固定时间(两个最大段生命周期)之后,没有收到服务器的ACK,任务服务器端已经正常关闭连接,于是自己也关闭连接,并且进入CLOSED状态。
HTTPS是介于HTTP和TCP/IP 协议之间的一种协议
SSL:secure sockets layer
TLS:transport layer security
作用:
1、能够让浏览器明确访问的网站是安全网站
2、一旦HTTPS连接成功,浏览器和服务器之前的数据传输都是加密传输(对称加密)
HTTPS工作原理:
1、客户端将自己支持的一套加密规则(SSL版本号,加密算法版本,哈希算法版本)发送给网站,网站接到客户端支持的加密规则,选择一组对应的算法版本
2、网站把 网站地址、加密公钥、证书颁发结构等信息以SSL证书的形式发送给客户端
1、客户端接收网站发送的证书之后,需要验证证书的合法性。从底层的SSL证书向上层证书进行验证。只要证书链中任意一级是可信的,那么这个证书是可信的
2、得到SSL证书中的域名,与当前访问网站域名做比对,比对通过,浏览器信任该站点
3、浏览器生成一个随机数random,并使用证书中的公钥进行加密(非对称加密),伪代码如:RSA(SSL证书中的公钥,random)->密文A
4、浏览器生成一个握手信息,如:"BJ",并使用确定HASH算法生成一个hash值,伪代码:HASH("BJ")->hash码
5、使用random对BJ握手信息进行对称加密,伪代码:encode(random,"BJ")->密文B
6、把密文A、hash码、密文B全都传给网站
3、服务端接到密文A、hash码、密文B后,使用服务器端SSL证书里的密钥对密文A进行解密,伪代码如:RSA(SSL证书中的密钥,密文A)->random
1、使用加密算法对密文B解密 decode(random,密文B)->握手信息
2、使用HASH算法算出握手信息的hash码,伪代码如:HASH(握手信息)->hash码
3、比对两个hash码是否一致。如果一致,服务器再生成一个握手信息进行加密,例:encode(random,"hello")->密文
4、对握手信息进行HASH算法,伪代码:hash("hello")->hash码
5、将密文和hash码传给客户端
4、客户端接收到密文和hash码
1、decode(random,密文)->握手信息
2、对握手信息进行HASH算法,HASH(握手信息)->hash码
3、比对hash码,如果一致,随机码已经验证过了,并且都各自存好了,此时两边都完成了HTTP交互, 现在的结果就是客户端和网站都持有个相同的random
接下来的请求就都使用encode(random,明文)进行加密传输了,服务端则使用decode(random,密文)->明文,此时这个加密算法就是对称加密了,所以我们拿到的应该是明文。