http协议格式get和post的区别以及数据包格式
区别:1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,POST方法是把提交的数据放在HTTP包的Body中;2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制;3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值;4. GET方式提交数据,会带来安全问题,请求是幂等的,POST没有安全性问题,因为要修改数据所以不是幂等的;
数据包:一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成,Get请求的请求行URL包含?后面的资源参数信息,不使用请求数据部分;其他部分和Post一样;
http1.0和http1.1有什么区别
Http1.0是短连接,每次请求都会新建连接,完成后立即中断连接,1.1是长连接,在同一个TCP连接中可以传输多个Http请求和响应;1.1增加了Host字段,解决一台物理机上多个虚拟机共享同一个IP;1.1新增了100状态码节约带宽,用于先发送header到服务器校验是否允许发送body,服务器允许则返回100,此时客户端再发送body数据;1.1增加了cache的新特性,增加了缓存的age和expire;
HTTP有哪些method
HTTP1.0定义了三种请求方法: GET(获取资源)、POST(添加资源)和HEAD(同Get,获取报头信息)方法;HTTP1.1新增了五种请求方法:OPTIONS(返回服务器支持的所有Http方法)、PUT(更新资源,需要包含整个资源对象)、PATCH(更新资源,只需要包含需要更新的字段)、DELETE(删除资源)、TRACE(回显服务器收到的请求)和CONNECT(管道连接预留)方法;
简述HTTP请求的报文格式
请求格式:请求行(请求方法、URI、协议版本)、请求头部、空行、请求正文;响应格式:状态行(协议版本、状态码、状态码描述)、响应头部、响应正文;
HTTP的长连接是什么意思
HTTP的长/短连接本质上是TCP的长/短连接,短连接:HTTP1.0中默认(Connection:closed),管理简单,但请求频繁浪费时间和带宽;长连接:HTTP1.1默认(Connection:keep-alive),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),省去TCP建立关闭操作,减少了时间和浪费,但客户端越多保持的链接越多, 可通过Keep-Alive: timeout=20设置长连接超时时间,max=XXX设置最多接收多少个客户端连接,传输完成根据Content-Length判断,动态生成的文件没有Content-Length根据分块传输,则根据最后一个块chunked编码实现;
HTTPS的加密方式是什么,讲讲整个加密解密流程
Https采用对称加密和非对称加密结合的方式来进行通信,对称加密速度快,要将密钥暴露,非对称加密速度慢,将公钥暴露供客户端加密,服务端使用私钥解密,出于安全和性能的综合考虑,证书验证采用废队恒加密,数据传输采用对称加密;
加解密过程:1、客户端访问服务端时生成随机数A,并将随机数A及自己支持的SSL版本号、加密算法等信息发送给服务端;2、服务端接收后确认双方加密算法并生成随机数B,并将随机数B及CA和服务端证书链发回给客户端;3、客户端收到证书后校验合法性并生成随机数C,使用证书公钥加密随机数C并发送给服务端;4、服务端使用私钥解密得到明文随机数C,服务端和客户端使用3个随机数确认加密秘钥;5、客户端使用对称加密算法和协商的秘钥一般是AES加密数据传给服务端;
Http和Https的三次握手有什么区别
Http和Https的三次握手本质上是TCP的三次握手,没有区别,Https采用了CA证书和SSL非对称加密+对称加密的方式保证数据的安全性,握手过程中服务端需要传输证书、校验证书、协商对称加密算法和秘钥;
如何理解HTTP协议的无状态性
无连接: 每次连接只处理一个请求,服务端处理完后即断开,节省传输时间,但会在建立和断开连接上花费大部分时间,Http1.1采用了长连接,Http2采用了多路复用技术,能够让多个请求和响应的传输完全混杂在一起进行,通过streamID来互相区别;
无状态: 服务端对于客户端每次请求都认为是一个新的请求,上一次会话和下一次会话没有联系,不保存请求和响应的通信数据 ;解放了服务器,不会造成不必要的连接占用,但每次请求都会传输大量重复的内容信息;采用cookie和seesion保存会话;
TCP三次握手和四次挥手的流程,为什么断开连接要4次,如果握手只有两次,会出现什么
建立连接3次握手:连接请求(客户端发送SYN=a,进入SYN_SEND状态)、请求确认(服务端发送ACK=a+1 SYN=b,进入SYN_RCVD)、连接确认(ACK=b+1,ESTABLISHED状态);断开连接4次挥手:主动断开方发送FIN包请求断开、被动断开方发送ACK、被动断开方发送FIN确认断开、主动断开方发送ACK后断开;
TCP建立连接要进行3次握手,而断开连接要进行4次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(即数据可在两个方向上同时传递),所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭,三次握手ACK用来应答,SYN用来同步,四次挥手服务端收到FIN后不会马上断开需要先回复ACK;
三次握手时确保发送双方都做好了数据发送准备,如果改成两次握手,可能造成发送方不能确认接收方是否准备好而重复发送数据的死锁;
TCP如何保证可靠性和安全性,说说TCP头的结构
保证可靠安全性:通过下列机制保证可靠性、数据的传输安全、顺序准确性及数据可达性;数据包校验,发送方计算校验和,接收方结算校验和,进行对比;确认应答+序列号, TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层 ;连接管理,建立连接三次握手和释放连接四次挥手;超时重传机制,发送后启动定时器,进行重传; 流量控制和拥塞控制,使用滑动窗口协商大小,连接双方都有缓冲区,如果缓冲区容纳不下时将协商降低发送速率;停止等待协议,每发送完一个分组,就停止发送,等待对方确认,收到确认后再发送下一个分组;
头结构:TCP报文的头部信息20字节包括:源端口号、目的端口号、序列号、确认序列号、头部长度、ACK/SYN/FIN等标识位、窗口大小(用于流量控制)、校验和、紧急指针(发送紧急数据);
TCP与UDP比较
1、TCP是面向连接的,比较可靠,UDP是无连接的,相对不可靠;2、TCP需要对数据进行分段,然后进行传输,UDP不需要对数据进行分段,当要发送数据时,抓取应用的数据并尽可能快的丢到网上,所以UDP传输速率高,适用于视频或者多人在线游戏; 3、TCP是重量级,TCP报文20字节,UDP是轻量级,UDP报文8字节; 4、TCP会确认序列号,保证数据的有序性,UDP可能会丢失;
计算机网络OSI7层模型(TCP4层)每层的协议
OSI七层模型:物理层(比特传输,将0/1信号与电/光信号互相转化,IEEE 802)、数据链路层(帧传输,物理MAC地址寻址,Ethernet)、网络层(报文传输,逻辑IP地址寻址,IP/ARP)、传输层(处理数据包实现通信,TCP/UDP)、会话层(建立节点、维护链接,DNS)、表示层(数据格式转换解码,Telnet)、应用层(面向用户,Http);
TCP/IP四层模型:网络接口层(物理+数据链路)、网络层、传输层、应用层(会话+表示+应用);
当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤
1.浏览器查找当前URL是否存在缓存,并比较缓存是否过期(cache-control,Expires,last-modified);2.DNS域名解析(先找HOSTS文件再找DNS服务器解析IP);3.建立TCP链接(3次握手:客户端发送SYN=j、服务端发送ACK=j+1 SYN=k、客户端发送ACK=k+1);4.浏览器向服务器发送HTTP请求;5.服务器处理并返回响应,浏览器接收响应;6.浏览器解析和渲染页面(DOM和CSS);7.关闭TCP链接(四次挥手:FIN ACK, ACK, FIN ACK, ACK);
如何避免浏览器缓存
1、Cache-Control:no-cache,pragma:no-cache或Cache-Control:max-age=0等设置不使用缓存;2、Expires字段指定缓存过期时间;3、HTTP响应头中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的请求无法被缓存;4、POST请求无法被缓存;5、经过HTTPS安全加密的请求不能被缓存(不同浏览器需要设置参数才能缓存如Control:Public);
什么是分块传送
分块传输把数据分解成一系列数据块,并以多个块发送给客户端,服务器发送数据时不再需要预先告诉客户端发送内容的总大小,只需在响应头里面添加Transfer-Encoding: chunked,以此来告诉浏览器我使用的是分块传输编码,这样就不需要Content-Length了; 允许服务器为动态生成的内容维持HTTP持久链接、Gzip压缩传输分隔多个部分,根据最后一个块大小为0和Connection为close判断传输完成;
Session和cookie的区别
Cookie:客户端跟踪用户会话,存储在客户端内存或文件,不可靠,相当于服务端发给客户端的凭证,弥补HTTP协议无状态的不足;不可跨域名使用、中文需UTF8编码,二进制使用BASE64编码;使用流程:客户端正常请求、服务端返回Set-Cookie头告诉客户端创建对应的Cookie、客户端创建或更新Cookie(内存临时保存或文件持久化)、客户端下次请求带上Cookie、服务端使用Cookie;
Session:服务端跟踪用户会话,存储在服务端,比较可靠,依赖Cookie;JSP内置了Session对象可直接使用;创建:先判断请求中是否带sessionId,请求JSP和Servlet会自动创建,或request.getSession(true)创建;过期时间:Tomcat或Web.xml或代码设置;使用流程:服务端随机生成JSESSIONID通过Cookie返回、客户端后续请求带上JSESSIONID、服务端判断JSESSIONID;不支持Cookie时:自动重写URL地址实现(通过查询参数添加或者加到URL最后分号分隔),或者表单隐藏字段提交;浏览器窗口的子窗口会共享父窗口的SessionId;由于只认ID获益不同窗口不一样不是同一Session;
网络攻击(CSRF、XSS、DDos)
XSS:跨站脚本攻击,利用用户对指定网站的信任,通过向网站写入 js 脚本或插入恶意html标签来实现攻击,危害有非法转账、篡改数据、盗取账号等;防范:白名单、数据校验、服务器端Set-Cookie字段设置HttpOnly参数;
CSRF:跨站请求伪造,利用网站对用户的信任,通过用户的登录Cookie信息骗取服务器的信任,以用户名义伪造请求发送给服务器;防范:通过Referer字段校验请求源、添加token验证、验证码;
DDOS:分布式拒绝服务攻击,利用大量合法的分布式服务器对目标发送请求,从而导致正常合法用户无法获得服务;防范:资源隔离、白名单,基于流量类型、请求频率、数据包特征进行控制;
什么是TCP粘包,拆包,解决方式是什么
操作系统按字节流读取导致发送的数据到接收时格式不正确,字符串被拆开了,服务端拆包和客户端粘包一一对应;比如 要发送的数据大于TCP发送缓冲区剩余空间大小将会发生拆包; 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包; 接收数据端的应用层没有及时读取接收缓冲区中的数据时将发生粘包等等;
解决问题的关键在于如何给每个数据包添加边界信息,如发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,接收时根据长度判断; 发送端将每个数据包封装为固定长度,接收端根据长度拆包;数据包之间通过特殊字符设置边界;