034* (网络七层架构)(TCP三次握手和四次挥手)(TCP、UDP、SOCKET、http、Https)(单向认证和双向认证)(http状态码)
一:网络7层协议和主要协议
OSI 模型 | 主要协议 | 单位 | 作用 |
应用层 | HTTP、FTP、Telnet、STMP、POP3、IMAP等 | 数据流 | 为应用程序提供访问网络服务的接口 |
表示层 | CSS GIF HTML JSON XML GIF | 数据流 | 数据格式转换、加密、压缩 |
会话层 | FTP SSH TLS HTTP(S) SQL | 数据流 | 建立会话 |
传输层 | TCP UDP | 数据段 | 建立端口到端口的通信。 |
网络层 | IP(IPV4、IPV6) ICMP | 数据包 |
进行逻辑地址寻址,实现不同网络之间的路径选择, 确保数据包及时传送。 |
数据链路层 | ARP、RARP | 帧 |
建立相邻结点之间的数据链路,通过差错控制 提供数据帧(Frame)在信道上无差错的传送 |
物理层 | V.35、EIA/TIA-232 | 比特流 | 为数据终端设备提供传送数据的通路 |
二:TCP三次握手和四次挥手
1:TCP报文首部首部的格式
1:序号seq(Sequence Number):占4个字节,用来标识从TCP发端向TCP收端发送的数据字节流(tcp传输的每一个字节都按顺序编号),它表示在这个报文段中的的第一个数据字节在数据流中的序号。主要用来解决网络报乱序的问题。
2:确认号ack(Acknowledgment Number):占4个字节,确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志为1时该确认序列号的字段才有效。主要用来解决不丢包的问题(确认序号减去上次收到的序号等于本段收到的报文的长度)。ack=上次发送的seq+1
3:确认ACK:标志位。TCP应答号将会包含在TCP数据包中,有两个取值:0和1,为1的时候表示应答域有效,反之为0。也规定连接建立后所有发送的报文的ACK必须为1。
4:同步SYN:表示同步序号,用来建立连接,SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来 ,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手。
5:终止FIN: 表示发送端已经达到数据末尾,将释放一个连接,FIN = 1, 表示报文段的发送方的数据已经发送完成,请求释放连接。
2:三次握手
客户端向服务端发送连接请求报文段。该报文段的头部中同步SYN=1,确认ACK=0,同时选择一个初始序号seq=x。请求发送后,客户端便进入SYN-SENT(请求连接)状态。
- SYN=1,ACK=0表示该报文段为连接请求报文
- seq=x为本次TCP通信的字节流的初始序号
- TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号
2.第二次握手
服务端收到连接请求报文段后,如果同意连接,会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。发送完应答后服务端进入SYN-RCVD(同步收到)状态。
- SYN=1,ACK=1表示该报文段为连接同意的应答报文
- seq=y表示服务端作为发送者时,发送字节流中的第一个字节序号
- ack=x+1表示服务端希望客户端发送的下一个数据报初始序号是从x+1开始
3.第三次握手
客户端收到服务端连接同意的应答后,还会向服务端发送一个确认报文段,表示:服务端发来的连接同意应答,已经成功收到。该报文段的头部为:
ACK=1,seq=x+1,ack=y+1。
客户端发完这个报文段后便进入ESTABLISHE(链接成功)D状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成
1.第一次挥手
客户端数据发送完成,则它向服务端发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,客户端将进入FIN-WAIT-1状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- FIN=1表示该报文段是一个连接释放请求
- seq=u,u-1是客户端向服务端发送的最后一个字节的序号
2.第二次挥手
服务器收到客户端连接释放报文,通知相应的高层应用进程,告诉它客户端向服务器这个方向的连接已经释放了。
此时服务端进入了CLOSE-WAIT(关闭等待)状态,并向客户端发出连接释放的应答,其报文头包含:
ACK=1,ack=u+1,并且带上自己的序列号seq=v。
- ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答
- seq=v,v是服务端释放应答报文段第一个字节序号
- ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节
客户端收到该应答后,进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
第二次挥手完成后,
客户端到服务端方向的连接已经释放,服务端不会再接收客户端的数据,客户端也没有数据要发送了。
但服务端到客户端方向的连接仍然存在,服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3.第三次挥手
服务端将最后的数据发送完毕后,就向客户端发送连接释放报文,其报文头包含:
FIN=1,
ack=u+1,
由于在CLOS-WAIT状态,服务端很可能又发送了一些数据,
假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
4.第四次挥手
客户端收到服务器的连接释放报文后,向服务端发出确认应答,报文头:ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。
该状态会持续2MSL(最长报文段寿命)时间,这个期间TCP连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入CLOSED状态,撤销TCP链接。
服务端只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCP后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
4:为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
三:TCP、UDP、SOCKET、HTTP
TCP为传输控制层协议,为面向连接、可靠的、点到点的通信;Hypertext Transfer Protocol
):短连接,客户端向服务器发送一次请求,服务器响应后连接断开,节省资源。服务器不能主动给客户端响应(除非采用HTTP长连接技术),Secure Hypertext Transfer Protocol
),它是一个安全通信通道,基于HTTP开发,用于客户计算机和服务器之间交换信息,使用安全套结字层(SSI
)进行信息交换,即HTTP的安全版。
6:建立socket链接至少需要一对套接字,其中一个运行与客户端,请一个运行于服务端,连接过程主要分为3步:服务器监听、客户端请求和连接确认。
1:具体做法是:发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”,这样可以确保交换的密钥是安全的前提下,使用对称加密方式进行通信。
2:所有字段:按字符顺序排列,hash算法,信息摘要,拼接成一个新的字段。
2:证书生成
1)申请认证:服务器需自己生成公钥私钥对pub_svr & pri_svr,同时根据 pub_svr 生成请求文件 csr, 提交给 CA 机构,csr 中含有公钥、组织信息、个人信息(域名)等信息。(图一中 server.req 就是 csr 请求文件)
2)审核信息:CA 机构通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等。
3)签发证书:如信息审核通过,CA 机构会向申请者签发认证文件-证书。
证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。
签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名。(图一中生成 server.crt)
4)返回证书:client 如果请求验证服务器,服务器需返回证书文件。(图一中 handshake 传回 server.crt)
5)client验证证书:client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法。客户端然后验证证书相关的域名信息、有效时间是否吊销等信息。
客户端会内置信任 CA 的证书信息(包含公钥),如果 CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法。(图一中check 可选,我们可以选择不验证服务器证书的有效性)
6)秘钥协商:验证通过后,Server 和 Client 将进行秘钥协商。接下来 Serve r和 Client 会采用对称秘钥加密。(对称加密时间性能优)(图一中 pre-master/change_cipher_spec/encrypted_handshake_message 过程)
7)数据传输:SSL Server 和 SSL Client 采用对称秘钥加密解密数据。
3:HTTPS采用对称加密和非对称加密两者并用的混合加密机制
1.Client发起一个HTTPS(比如https://juejin.im/user/5a9a9cdcf265da238b7d771c)的请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
2.Server把事先配置好的公钥证书(public key certificate)返回给客户端。
3.Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
4.Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。
5.Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
6.Server使用对称密钥加密“明文内容A”,发送给Client。
7.Client使用对称密钥解密响应的密文,得到“明文内容A”。
8.Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”
四:单向认证和双向认证
1:单向认证流程中,服务器端保存着公钥证书和私钥两个文件,整个握手过程如下:
- 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务器端;
- 服务器端将本机的公钥证书(server.crt)发送给客户端;
- 客户端读取公钥证书(server.crt),取出了服务端公钥;
- 客户端生成一个随机数(密钥R),用刚才得到的服务器公钥去加密这个随机数形成密文,发送给服务端;
- 服务端用自己的私钥(server.key)去解密这个密文,得到了密钥R
- 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。
2: 双向认证流程
- 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务端;
- 服务器端将本机的公钥证书(server.crt)发送给客户端;
- 客户端读取公钥证书(server.crt),取出了服务端公钥;
- 客户端将客户端公钥证书(client.crt)发送给服务器端;
- 服务器端使用根证书(root.crt)解密客户端公钥证书,拿到客户端公钥;
- 客户端发送自己支持的加密方案给服务器端;
- 服务器端根据自己和客户端的能力,选择一个双方都能接受的加密方案,使用客户端的公钥加密8. 后发送给客户端;
- 客户端使用自己的私钥解密加密方案,生成一个随机数R,使用服务器公钥加密后传给服务器端;
- 服务端用自己的私钥去解密这个密文,得到了密钥R
- 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。
五:Http状态码
HTTP状态码(HTTP Status Code)
200 请求被正常处理
206 客户端只是请求资源的一部分,服务器只对请求的资源执行GET方法,相应报文中通过Content-Range 指定范围的资源
301 永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL;
302 临时重定向临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL)
303 与302状态码有相似的功能,只是它希望客户端应使用GET方法 临时重定向定向获取请求的资源
304 发送附带条件的请求时,条件不满足时返回,与重定向无关
307 临时重定向,与302类似,只是强制要求使用post方法
400 请求报告语法有误,服务器无法识别
401 请求需要认证
403 请求的对应的资源禁止被访问
404 服务器无法找到对应的资源
410(已删除)如果请求的资源已永久删除,服务器就会返回此响应。
500 服务器内部错误
503 服务器正忙
502(错误网关)服务器作为网关或代理,从上游服务器收到无效响应。
504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求。
六:证书格式:
pem(把二进制数据用base64编码)->crt(二进制数据)->(der[公钥、证书]、p12[私钥])
crt和pem中有公钥和私钥他们是base64编码的文件。
1:Privacy Enhanced Mail,一般为文本格式,以 -----BEGIN...
开头,以 -----END...
结尾。中间的内容是 BASE64 编码。这种格式可以保存证书和私钥。
—–BEGIN CERTIFICATE—–
MIIE9jCCA96gAwIBAgIQVXD9d9wgivhJM//a3VIcDjANBgkqhkiG9w0BAQUFADBy
—–END CERTIFICATE—–
2:.CRT,可以是二进制格式,可以是文本格式
七:其他问题
1:get和post的区别
1:用途不同:
- GET:一般用于请求
- POST:一般用于表单提交,提交数据
2:安全性不同
- GET:不安全,GET的请求是明文传输,简而言之就是你的请求信息是直接跟在URL后面的,用户都看得到
- POST:安全,POST方法会将信息放在请求体body中,用户是看不到的
3:数据长度限制
- GET:对传输的数据长度有限制
- POST:对数据长度没有限制,因为数据都是放在消息体中的
4::是否会自动缓存
- GET:GET请求会被浏览器自动缓存
- POST:缓存需要手动设置
5:编码类型
- get:application/x-www-form-urlencoded
- post:application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
2:http请求有哪些部分
请求报文包含:请求行、请求头、请求体四部分组成。
响应报文包含:状态行、响应头、响应体三部分组成。
Accept:浏览器可接受的MIME类型;
Accept-Charset:浏览器可接受的字符集;
Accept-Encoding:浏览器能够进行解码的数据编码方式,
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;
Content-Length:表示请求消息正文的长度;
Cookie:这是最重要的请求头信息之一;
Host:初始URL中的主机和端口;
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答;
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;
4:Ping是什么协议?
Ping命令用ICMP是“Internet Control Message Ptotocol”(Internet控制消息协议)的缩写,用于IP主机,路由器之间传递消息。
控制消息是指网络通不通,主机是否可达,路由器是否可用等网络本身的消息,这些控制消息并不传输用户数据。
5:知道MTU吗?
Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。
为什么是1500?其实一个标准的以太网数据帧大小是:1518
,头信息有14字节,尾部校验和FCS占了4字节,所以真正留给上层协议传输数据的大小就是:1518 - 14 - 4 = 1500,那么,1518这个值又是从哪里来的呢?
6:TCP头部多长,IP头部有多长?
TCP头部20 bytes
IP头部20 bytes
7:Http2.0如1.x的区别
1:HTTP1.0和HTTP1.1的一些区别
长连接,缓存策略,
2:HTTP2.0和HTTP1.X的区别
- 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
- header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。
8:TCP 流量控制
双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。
如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。
对发送方发送速率的控制,我们称之为流量控制。
9:比较 Cookie 和 Session
cookie 和session 的区别:
- 作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
- 存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。
- 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
- 隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
- 存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。
cookie 和session 的联系:
session是通过cookie来工作的
session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。
在购物网站中通常将用户加入购物车的商品联通session_id记录到数据库中,当用户再次访问是,
通过sessionid就可以查找到用户上次加入购物车的商品。因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。
10:断点续传怎么实现?需要设置什么?
会用到HTTP首部字段Range来指定资源的byte范围