本文只是表达个人对http概念,get、post方法,http各大版本以及https、socket的理解。如有问题,欢迎指正
一、TCP/UDP的概念
TCP可以理解为是一个协议组或者是一个网络服务模型。是基于连接的协议,在收发数据前,需要建立可靠的连接,也就是所谓的三次握手。使用TCP协议时,数据会准确到达,但是效率较低
UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。使用UDP协议时,传输效率高,但是不能保证数据准确到达
网络层:有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
传输层:有TCP协议与UDP协议。
应用层:有FTP、HTTP、TELNET、SMTP、DNS等协议
二、HTTP
HTTP全称超文本传输协议,是基于tcp/ip协议,属于应用层协议
http非常的宽松,只是定义了大的标准,至于遵守还是修改,只看个人!这句话很重要,很重要,很重要
特点:
1、请求/响应模型,客户端发起请求,服务器响应。
2、无状态。每个请求都是独立的,互不影响。即使相同的客户端发起相同的请求,也是完全独立的。http不会为了下一次连接而维护这次连接所传输的信息
3、无连接。每次连接只处理一个请求。连接->传输数据->关闭连接 。客户端跟服务端完成了一次http交互流程后,便关闭连接。
但是1.1后会有keep-alive,下面会讲到
4、明文传输。http协议不会对传输的信息进行加密。这里可能会有个疑问,http是二进制传递数据的,我们对传输的数据进行加密,怎么就是明文传输的呢?其实明文在此处只是相对的。http非常的宽松。给予了传输管道而不对管道中的东西做任何加密处理,这就是http的明文传输标准。至于你自己对数据加密,我不知道,不管。如果自己对数据加密就宣称某某某加密传输协议,不说其他的,http协议都能被叫出无限的某某某加密协议了
三、HTTP1.0、1.1、2.0
1、HTTP1.0
在HTTP1.0中,客户端每发送一次请求都需要新建一个独立的连接,客户端得到服务端响应后再断开本次连接。
每次请求都握手、建立链接,这非常的浪费时间
HTTP1.0只有GET POST和HEAD方法
2、HTTP1.1
在HTTP1.1中,打印请求的header,会发现Connection:keep-alive,默认持久链接。如果是close时,客户端通知服务器返回本次请求结果后关闭连接。这意味着可以在一次连接中处理多次请求,大大节省了时间和性能。
尽管有 Keep-Alive 机制可以复用,但在每个连接上同时只能有一个请求 / 响应,这意味着完成响应之前,这个连接不能用于其他请求。可以理解为请求队列,同时只能处理一个请求,先进先出。
HTTP1.1增加5个新的方法:OPTIONS,PUT,DELETE,TRACE和CONNEC
3、HTTP2.0
1、HTTP2.0是完全多路复用的,而非有序并阻塞的
在HTTP1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量的限制。超过限制数目的请求会被阻塞。而多路复用是基于二进制分帧层,既在共享TCP链接的基础上同时发送请求和响应。HTTP消息被分解为独立的帧,而不破坏消息本身的语义,交错发出去,在另一端根据流标识符和首部将他们重新组装起来
3、HTTP2.0让服务器可以将响应主动“推送”到客户端
服务端根据客户端的请求,提前返回多个响应,推送额外的资源给客户端。比如客户端请求A,但是服务端可以返回A和额外的B,C等。但是需要注意所有推送的资源都必须遵守同源策略。既需要双方确认,才可以推送。
。。。。省略N字,还有很多
四、GET、POST
1、get请求参数拼接在URL后面,只能进行url编码,会被浏览器主动cache,传递的参数有长度限制。。。
2、post请求参数放在Request body中。不会被浏览器cache,除非另行设置。传输数据多样化。。。
然后,只是这些么?
http有Header、Body。
Header最常见的Content-Type:application/json、Content-Type:image/jpg等
Body有form-data、x-www-form-urlencoded、raw等格式
https://blog.csdn.net/u013827143/article/details/86222486
x-www-form-urlencoded:为默认缺省值,键值队传递参数,然而向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低
form-data:键值队传递参数,可以传递多个文件
raw:可以上传任意格式的数据,json、xml、html等。然后没有key,所有一次只能传递一条文本数据。比如一次只能传递一张图片
但是但是,上面说了http非常的宽松,只是定义了大的标准
假如我Header设置Content-Type:application/xml 但是Body设置raw 传递json数据 可以么?
假如我Body设置raw 传递多张图片数据,自己在数据中设置分隔符区分 可以么?
可以,也不可以
服务端可以收到和解析你的数据,你跟服务器商量好,都是可以的。
但是这不符合http的标准。有大的标准给你,为什么非得走自己的小标准呢。项目组人员多,跨应用对接,谁心里会没有千万颗草呢
get方法一样可以设置requrest body 传递参数
post方法一样可以设置参数拼接在url后面
只是这样浏览器怎么cache你的get请求呢?一般浏览器是根据url为key来cache。并且有的浏览器会读取你get请求中request body,有的会忽略,不能保证一定能被接收到
在Android中,一些网络框架为了规范,禁止get中设置requrest body
至于PUT,DELETE等方法跟POST有啥区别,暂时没有研究过。现在只能说信仰,对标准的信仰
五、HTTPS
基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护。具体流程以及多了几次握手,可以自行百度
六、SOCKET
socket长连接,套接字。
这个长连接跟http1.1的长连接又有什么区别呢?
http上面说了是请求/响应模型。客户端主动要,服务端被动给。但是socket长链接却是平等的,客户端和服务端能互传信息。
http请求和响应不会对通信方进行确认、无法保护数据的完整性。
socket一般采用tcp/ip
tpc/ip 通过IP能定位到一台服务器。但是服务器不可能专为你一个人服务。OK,那我们再来定义个socket,这个socket只为你服务,服务端再跟B定义个socket,这个又只为B服务。所以就形成了tpc/ip +socket
socket一般用来处理 服务端与客户端交互频繁并且即时的业务 如即时聊天,股票、医疗等
socket需要开发者注意消息包头、包体、断点续传、心跳包、丢包等系列问题。推荐使用xmpp二次开发
socket写得好很流弊,写得不好,会非常。。。你懂的
写到此处,想起N年前开发的医疗心电项目。后续有时间写出来,给自己一个备份