1.http协议和组成
客户端请求:请求行 请求头 空行 请求体
请求行包含请求方法、URI、HTTP版本信息
请求头包括:
accept-encoding:指定客户端可接收的内容编码
accept-language:指定客户端可接收的编码语言
host:用户指定请求资源的主机和端口号
cookies:用于存储本地的数据
refer:用于标识这个请求是从哪个页面来的,如登录前是从主页来的,就显示主页的信息
user-agent(UA):用于识别用户的使用的客户端版本等信息
content-type:用于标识具体请求的媒体类型,这里是表单类型
connect:长链接
等等
服务端响应:状态行 消息报头 空行 响应正文
状态行:包含HTTP版本、状态码、状态码的原因短语
长连接keep-alive
2.https协议加密原理,http与https区别
2.1ssl
非对称加密传递对称加密密钥,对数据进行加解密
私钥生成公钥,私钥存储在服务器端,公钥在客户端
公钥加密,私钥解密,私钥加密,公钥解密
非对称加密无法解决服务端将数据返回给客户端时的安全性,但是中间环节只能看到内容,中间过程都知道公钥。先进行tcp三次握手,再进行TLS四次握手
2.2数字证书+数字签名
浏览器向服务器发请求,服务器把公钥A发给浏览器,浏览器用公钥加密生成一个对称密钥T,用密钥T进行数据加密传输,服务器收到数据后先用私钥解密得到浏览器的对称密钥T,用T进行解密,最后响应也用T进行加密传输数据
数字证书
2.3https建立连接过程
1、在使用HTTPS时需要保证服务端配置正确了对应的安全证书
2、客户端发送请求到服务端
3、服务端返回公钥和证书到客户端
4、客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端
5、服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做私钥对需要发送的数据进行对称加密
6、客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户
7、SSL加密建立
3.HTTP与HTTPS的区别
(a:通信使用明文不加密,内容可能被窃听
b:不验证通信方身份,可能遭到伪装
c:无法验证报文完整性,可能被篡改)
1.https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用
2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4.http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
HTTPS就是HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护
4.http1.1和http2.0的 区别(grpc http2.0)
- HTTP2采用二进制格式而非文本格式
- HTTP2是完全多路复用的,做到同一个连接并发处理多个请求而非有序并阻塞的——只需一个连接即可实现并行
3.HTTP2对请求和响应的头部进行压缩,HTTP2.0降低了开销
压缩方式是:HAPCK - HTTP2让服务器可以将响应主动“推送”到客户端缓存中
5.tcp三次握手,四次挥手,为什么要time_wait
需要处理对端可能重传的FIN报文或其它一些因网络原因而延迟的数据报文
5.1为什么等待时间是2MSL?
一个报文传递的最大时间是MSL 当主动发起方收到被动关闭方的关闭请求时,如果未发送确认标志给被动关闭方,或者中途传输有问题时,耗时1个MSL,经过这一个MSL后,被动关闭方会再次发送一个关闭连接的包给主动关闭方,MSL是可以设置的。
5.2 如何让tcp连接根本不进入time_wait状态?
禁用socket延迟关闭;
禁用net.ipv4.tcp_tw_reuse;仅仅对客户端生效
禁用net.ipv4.tcp_tw_recycle;开启这个选项,对客户端和服务端都会产生影响
mac地址:局域网地址(LAN Address),以太网地址或物理地址,它是一个用来确认网络设备位置的位址。用于在网络中唯一标示一个网卡。
6.七层ISO网络模型
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
五层:应用层、传输层、网络层、数据链路层、物理层
每层的作用:
7.http请求方式
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。
GET方法与POST方法的区别
区别一:get重点在从服务器上获取资源,post重点在向服务器发送数据;
区别二:get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;
post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;
区别三:Get传输的数据量小,因为受URL长度限制(一般浏览器限制2K),但效率较高;Post可以传输大量数据,所以上传文件时只能用Post方式;
区别四:get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;post较get安全性较高;
区别五:get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。post支持标准字符集,可以正确传递中文字符。
8.restfulapi
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
9.tcp粘包问题如何处理
1.固定发送信息的长度
2.两个信息直接加入分割符
3.将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小.
10.tcp协议的滑动窗口
一种流量控制技术,通信双方不会考虑网络的拥挤情况直接发送数据
同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,解决网络拥塞问题
滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接收任何应答之前传送附加的包。接收方告诉发送方在某一时刻能送多少包
,从而控制发送方的速度,防止发送方发送速度过快而导致自己被淹没。
11.快速重传
如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK,发送端便知晓哪个报文段在传输过程中丢失了,于是重发该报文段,不需要等待超时重传定时器溢出再发送该报文。
11.cookie
解决http协议无状态的会话技术
HTTP 协议本身是无状态的,为了使其能处理更加复杂的逻辑,HTTP/1.1 引入 Cookie 来保存状态信息。
Cookie是由服务端产生的,再发送给客户端保存,当客户端再次访问的时候,服务器可根据cookie辨识客户端是哪个,以此可以做个性化推送,免账号密码登录等等
12.session
session用于标记特定客户端信息,存在在服务器的一个文件里。 一般客户端带Cookie对服务器进行访问,可通过cookie中的session id从整个session中查询到服务器记录的关于客户端的信息。
13.简述http状态码和对应的信息
1XX:接收的信息正在处理
2XX:请求正常处理完毕
3XX:重定向
4XX:客户端错误
5XX:服务端错误
常见错误码:
301:永久重定向
302:临时重定向
304:资源没修改,用之前缓存就行
400:客户端请求的报文有错误
403:表示服务器禁止访问资源
404:表示请求的资源在服务器上不存在或未找到
500: 服务器内部错误
502:网关错误
14.转发和重定向的区别
转发是服务器行为。服务器直接向目标地址访问URL,将相应内容读取之后发给浏览器,用户浏览器地址栏URL不变,转发页面和转发到的页面可以共享request里面的数据。
重定向是利用服务器返回的状态码来实现的,如果服务器返回301或者302,浏览器收到新的消息后自动跳转到新的网址重新请求资源。用户的地址栏url会发生改变,而且不能共享数据。
15.浏览器输入url经历了哪些过程
浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容
一、DNS的域名解析(浏览器缓存的DNS结果,本机的hosts,本地域名服务器,根域名服务器,直到找到ip)
二、建立tcp连接
三、发送一个http请求
四、服务器处理相关请求
五、返回响应的结果
六、关闭tcp连接
七、浏览器解析HTML
八、浏览器进行布局渲染
15. TCP、UDP的区别,什么情况用TCP、什么情况用UDP
TCP 面向连接、稳定可靠传输,安全,tcp对系统资源的要求更多
UDP 不面向连接 不可靠性 速度快 对数据要求不高 udp对系统资源的要求更少,udp会丢包
UDP用于传输少量数据(数据包模式)
16. TCP、UDP的首部字段
TCP报头最小20个字节,最大60字节。
TCP首部开销20字节;
TCP首部通常是20字节,封装在IP数据报中。
16.1 TCP首部字段
源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;(各占16位)
32位序号/32位确认号: 后面详细讲;
4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60
3位保留字段6位标志位:
URG: 紧急指针是否有效 当URG=1,表明紧急指针字段有效,该报文段有紧急数据,应尽快发送。
ACK: 确认号是否有效 当ACK=1时,确认号才有效,连接建立后,所有的报文段ACK都为1。
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走,接收方接收到PSH=1的报文段,会尽快交付接收应用经常,不再等待整个缓存填满再交付。实际较少使用。
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段 RST=1时,表明TCP连接中出现严重差错,必须是否连接,再重连。
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段 在建立连接时用来同步序号。当SYN=1,ACK=0,则表明是一个连接请求报文段。SYN=1,ACK=1则表示对方同意连接。TCP建立连接用到。
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段16位窗口大小
表示发送方自己的接收窗口,窗口值用来告诉对方允许发送的数据量。16位校验和
发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也 包含TCP数据部分.
检验和字段查验范围包括首部和数据部分。16位紧急指针(2字节)
标识哪部分数据是紧急数据;
URG=1时,紧急指针指出本报文段中的紧急数据的字节数(紧急字节数结束后为普通字节)40字节头部选项
例如最大报文段长度MSS。MSS指的是数据部分的长度而不是整个TCP报文段长度,MSS默认为536字节长。窗口扩大,时间戳选项等。
16.2 UDP的首部开销小,只有8个字节
(1)源端口号:在需要对方回信时选用。不需要时可用全0。
(2)目的端口号:这在终点时交付报文时必须要使用到。
(3)长度:UDP用户数据报的长度,其最小值是8(仅有首部)。
(4)校验和检测UDP用户数据报在传输中是否有错。有错就丢弃。
TCP靠什么保证的可靠传输
三次握手,四次挥手
TCP三次握手
1.主机A向主机B发送建立连接请求,建立连接标识SYN=1,序列号seq=x,握手请求发送后 A 的状态为 SYN_SENT
2.主机B收到主机A的连接请求,发送SYN=1,序列号seq=y,确认标识ACK=1,确认序列号ack=x+1,A 接收到 B 的确认后,状态变为 ESTABLISHED,B 的状态依然为 SYN_RCVD!
3.主机A接收到B的建立连接请求后,发送确认标识ACK=1,序列号seq=x+1,确认序列号ack=y+1,B 接收到 A 的确认后,A 和 B 的状态都变为 ESTABLISHED!
为什么不是2次或者4次
两次握手的话B不知道A是否能收到自己的消息
四次的话多余了,浪费资源
说下服务器端第二次握手的报文丢失,客户端和服务器分别会做什么
如果多次重传失败会怎么样
TCP四次挥手
A:我要关闭了
B:好的,我知道了
B:我准备好了,我也要关闭了
A:好的,我知道了
知道time-wait状态吗
time_wait过多解决方法
1.可以改为长连接,但代价较大,长连接太多会导致服务器性能问题;
2.修改ipv4.ip_local_port_range,增大可用端口范围,但只能缓解问题,不能根本解决问题;
3.客户端程序中设置socket的SO_LINGER选项;
4.客户端机器打开tcp_tw_recycle和tcp_timestamps选项;
5.客户端机器打开tcp_tw_reuse和tcp_timestamps选项;
6.客户端机器设置tcp_max_tw_buckets为一个很小的值;
close-wait
主动关闭的一方发出 FIN 包,被动关闭的一方响应 ACK 包,此时,被动关闭的一方就进入了 CLOSE_WAIT 状态。如果一切正常,稍后被动关闭的一方也会发出 FIN 包,然后迁移到 LAST_ACK 状态。
在对方关闭连接之后服务器程序自己没有进一步发出ack信号。换句话说,就是在对方连接关闭之后,程序里没有检测到,或者程序压根就忘记了这个时候需要关闭连接,于是这个资源就一直被程序占着。
close_wait太多解决方案:重启进程
1.代码层面做到
第一:使用完socket调用close方法;
第二:socket读控制,当读取的长度为0时(读到结尾),立即close;
第三:如果read返回-1,出现错误,检查error返回码,有三种情况:INTR(被中断,可以继续读取),WOULDBLOCK(表示当前socket_fd文件描述符是非阻塞的,但是现在被阻塞了),AGAIN(表示现在没有数据稍后重新读取)。如果不是AGAIN,立即close
2.可以设置TCP的连接时长keep_alive_time,还有tcp监控连接的频率以及连接没有活动多长时间被迫断开连接
为什么等2MSL时间
30s
最后一个fin报文最大生存时间是MSL,如果发送失败,要等待再次发送又需要MSL,所以最大时间是2MSL
可以禁用socket延迟关闭,不等待
为什么不能是3次,就是服务端将FIN和ACK合并在一起发
还有一些请求资源的正在进行,不能马上进入关闭连接状态
UDP可以多对多吗
UDP支持一对一,一对多、多对一和多对多的交互通信。
多对多:比如微信的群视频
大端、小端
小端字节序(高-高,低-低):低字节存于内存低地址;高字节存于内存高地址
大端字节序:高字节存于内存低地址;低字节存于内存高地址;
网络字节序
网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;
UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;
所以说,网络字节序是大端字节序;比如,我们经过网络发送整型数值0x12345678时,在80X86平台中,它是以小端发存放的,在发送之前需要使用系统提供的字节序转换函数htonl()将其转换成大端法存放的数值;
ARM既可以工作在大端模式,也可以工作在小端模式。
一台服务器可以建立多少tcp连接
理论上 232(ip地址)X216(端口号)
但实际上少的多
具体因素:端口号资源(一般会限制可用的端口号)、文件描述符资源、线程数、内存资源、CPU资源
参考一台服务器可以建立多少tcp连接
重启服务器,所有进程都没了
查看服务器http请求的各种状态
netstat -nat|grep -i "80"|wc -l (80端口的http请求)
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' (http请求的各种状态)
netstat -nat|grep ESTABLISHED|wc -l (处于某个状态的http请求)