各层网络协议相关
1、OSI,TCP/IP,五层协议的体系结构
- OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- TCP/IP分层(4层):网络接口层(连接层)、 网络层、传输层、 应用层
- 五层协议 (5层):物理层、数据链路层、网络层、传输层、 应用层
TCP/IP口诀:从网络接口(层)获取数据时,需经过网络(层)访问,传输(层)到我们的应用(层)
各层网络协议的作用
- 物理层:连接两台主机之间的物理介质,单纯的01传输电信号
- 数据链路层:数据链路层规定电信号的分组方式,使用广播的方式在子网络中通过Mac地址的匹配,实现不同电脑上的数据传输
- 网络层:通过arp协议,使用ip来区分不同的计算机是否属于同一个子网络,再通过广播的方式在子网络中通过Mac地址的匹配,实现不同电脑上的数据传输
- 传输层:建立一个端口到另一个端口的通信(TPC/IP协议)
- 应用层:规定应用程序的数据格式(HTTP协议)
IP地址的分类
- A类地址: 第一个字节范围:0~127(0.0.0.0 - 127.255.255.255),默认子网掩码255.0.0.0
- B类地址: 第一个字节范围:128~191(128.0.0.0 - 191.255.255.255),默认子网掩码255.255.0.0
- C类地址:第一个字节范围:192~223(192.0.0.0 - 223.255.255.255),默认子网掩码255.255.255.0
网络请求之Get和Post的区别
- 传递方式:Get通过地址栏传输,Post通过报文传输
- 传递长度:Get提交数据最多1024字节,Post则没有限制
- 传递用途:Get是从服务器中获取数据,Post是向服务器发送数据
TCP三次握手和四次挥手
1、相关概念
- TCP三次握手:在客户端发送connect()的时候调用触发,即建立TCP连接,总共需要客户端和服务端共发送3个包来确保连接的建立
- TCP四次挥手:在客户端发送close()的时候调用触发,即断开TCP连接,总共需要客户端和服务端共发送4个包来确保连接的断开
2、相关术语
- 序号:Seq序号(Sequence number顺序号码),占32位,用来标识从TCP源端向服务端发送的字节流
- 确认序号:Ack序号(Acknowledge number确认号码),占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1
- 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
- URG:紧急指针有效(urgent紧急)
- ACK:确认序号有效(acknowledgement 确认)
- PSH:接收方应该尽快将这个报文交给应用层(push传送)
- RST:重置连接(reset重置)
- SYN:发起一个新连接(synchronous建立联机)
- FIN:释放一个连接(finish结束)
需要注意:不要将确认序号Ack与标志位中的ACK搞混了
3、TCP三次握手过程
- 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认
- 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态
- 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了
4、TCP四次挥手过程
情况一:由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这里先说明客户端执行主动关闭,服务端执行被动关闭的挥手操作
- 第一次挥手:Client发送一个FIN,表示需要关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1,Server进入CLOSE_WAIT状态
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手
情况二:客户端和服务端同时发起主动关闭挥手操作,其四次挥手操作与上面的操作原理是一样的,这里不做解释
5、相关状态
- CLOSED:表示初始状态
- LISTEN:表示服务器端的某个socket处于监听状态,可以接受连接
- SYN_RCVD:表示接受到了SYN报文
- SYN_SENT:表示客户端已发送SYN报文
- ESTABLISHED:表示连接已经建立
- FIN_WAIT_1:表示等待对方的FIN报文
- FIN_WAIT_2:表示等待对方的FIN报文,和FIN_WAIT_1的区别是,FIN_WAIT_2表示有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接
- TIME_WAIT:表示收到了对方的FIN报文,并发送出了ACK报文
- CLOSING:正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。这种情况,只有在双方几乎在同时close一个socket的时,那么就出现了双方同时发送FIN报文的情况,同时也会出现CLOSING状态,表示双方都正在关闭socket连接
- CLOSE_WAIT:表示在等待关闭
- LAST_ACK:表示被动关闭一方在发送FIN报文后,最后等待对方的ACK报文
6、为什么TCP连接是三次握手,断开是四次挥手?
- 在三次握手的时候,服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端,所以有三次发送包的机会
- 在四次挥手的时候,当服务端收到客户端的FIN报文时,仅仅表示客户端不再发送数据,但是还能接收数据,服务端也未必把全部数据都发送给客户端了,所以服务端可以立即close,也可以发送一些数据给客户端后,再发送FIN报文给客户端来表示同意现在关闭连接,因此,服务端ACK和FIN一般都会分开发送,所以有四次发送包的机会
TCP和UDP的区别
TCP | UDP |
---|---|
面向连接,需要三次握手进行连接 | 面向非连接 |
传输可靠,采用字节流传输 | 传输不可靠,采用报文传输 |
能传输大量的数据 | 能传输少量数据 |
传输速度慢 | 传输速度快 |
连接方式有点对点连接 | 连接方式有一对一,一对多,多对多 |
提供超时重发,丢弃重复数据,流量控制等功能 | 没有超时重发等机制 |
HTTP1.0和1.1的区别
- 长连接:HTTP1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接
- 节约带宽:HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器,客户端如果接受到401,客户端就可以不用发送body信息,节约了带宽
- HOST域:HTTP1.0是没有host域的,HTTP1.1才支持这个参数
Http1.1和2.0的区别
- 多路复用:HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级
- 数据压缩:HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快
- 服务器推送:当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取,服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的
HTTP协议简述
- HTTP协议是请求-应答式协议,客户端发送一个请求,服务端需做出对应的应答
- HTTP协议用于Internet上发送和接收信息
- 所有的请求和应答都是HTTP包
- HTTP协议依靠可靠的TCP连接,默认端口是80
- HTTP协议第一个版本是0.9,之后发展到1.0、1.1,到现在的2.0
HTTP特点
- 简单快速
- 无连接:只要一次连接就能互相发送数据
- 无状态:对于用户上一次的页面操作没有记忆功能
HTTP报文结构
1、请求报文结构如下
< 请求行>
< 请求头>
< 空行>
< 请求体>
- 请求行:请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1
- 请求头:请求头由关键字/值对组成,每行一对,关键字和值用英文冒号分隔。请求头通知服务器有关于客户端请求的信息,例如,User-Agent:Firefox/13.0.1
- 空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头
- 请求体:请求体不在GET方法中使用,而是在POST方法中使用,POST方法适用于客户端填写表单的场合。请求体通常存放的是请求的数据内容
2、响应报文结构如下
< 状态行>
< 响应头>
< 空行>
< 响应体>
- 状态行:状态行由HTTP协议版本字段、状态码和状态码的描述文本3 个字段组成,它们用空格分隔。例如,HTTP/1.1 200 OK
- 响应头:响应头由关键字/值对组成,每行一对,关键字和值用英文冒号分隔。响应头通知客户端有关于服务端请求的信息,例如,Connection:close
- 空行:最后一个响应头之后是一个空行,发送回车符和换行符,通知客户端以下不再有响应头
- 响应体:响应体不在GET方法中使用,而是在POST方法中使用,响应体通常存放的是响应的数据内容
HTTPS简述
HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,主要用到对称加密、非对称加密、证书等技术进行加密,其默认端口为443。它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息,它使用安全套接字层(SSL,SSL使用40位关键字作为RC4流加密算法)进行信息交换,简单来说它是HTTP的安全版
HTTP和HTTPS的区别
HTTP | HTTPS |
---|---|
URL以http://开头 | URL以https://开头 |
不安全的 | 安全的 |
默认端口是80 | 默认端口是443 |
工作于OSI模型中的应用层 | 工作于OSI模型中的传输层 |
传输的数据无需加密 | 传输的数据进行加密 |
传输速度快 | 传输速度慢 |
访问无需证书 | 访问需要认证证书 |
URI和URL
1、URI(uniform resource identifier):统一资源标识符,表示某一互联网资源名称的字符串
URI的组成:(如:file://128.1.2.2:8080/abc/wo.txt)
- 访问资源的命名机制
- 存放资源的主机名
- 资源自身的名称(路径+文件名)
2、URL(uniform resource locator):统一定位资源符,表示从互联网上得到的资源的位置和访问方法,是互联网上标准资源的地址
URL的组成:(如:www.baidu.com)
- 协议
- 存有资源的IP地址
- 资源的具体目录地址
Cookie和Session的区别
- 存放位置:Cookie保存在客户端,Session保存在服务端
- 存取方式:Cookie存储的是ASCLL字符串,Session能存储任何类型的值
- 安全问题:Cookie是不安全,客户端可以修改,Session是安全的,服务器对客户端是不可见的
- 有效期:Cookie可以设置有效期大小,Session依赖于SessionId,如果SessionId设置为-1,关闭浏览器Session就会失效
- 对服务器造成压力:对于高并发的网络请求,Session压力比Cookie大
对称加密和非对称加密
对称加密:加密数据用的密钥,跟解密数据的密钥是一样的
非对称加密:私有密钥由一方保管,公有密钥双方公开
数字证书
数字证书是一个文件,表示互联网通讯中标识通讯各方身份信息的一串数字
数字签名
数字签名用于验证传输的内容是不是真实服务器发送的数据,判断发送的数据有没有被篡改过
TLS/SSL握手过程
详细介绍一下图中过程:
- 客户端给出协议版本号、一个客户端随机数A(Client random)以及客户端支持的加密方式
- 服务端确认双方使用的加密方式,并给出数字证书、一个服务器生成的随机数B(Server random)
- 客户端确认数字证书有效,生成一个新的随机数C(Pre-master-secret),使用证书中的公钥对C加密,发送给服务端
- 服务端使用自己的私钥解密出C
- 客户端和服务器根据约定的加密方法,使用三个随机数ABC,生成对话秘钥,之后的通信都用这个对话秘钥进行加密
DNS
DNS用来将主机名和域名转换为IP地址