浅析Socket、HTTP、SOAP、Restful、PHP、JSP、H5演变和区别(一)

引言

最近得空,梳理了一下常用的网络程序开发工具,怕时间久了脑袋不够用,又给忘记了,特梳理如下。
计算机诞生以来,从最初以科学计算为目沧海一粟的巨型机到目前以服务提供为目的随处开花的x86刀片、云主机,业务、功能和成本发生了翻天覆地的变化,其中网络硬件及程序开发的变革起着关键作用。这里对硬件的总线、串口通信、局域网通信暂不介绍,主要对基于ip网络的软件开发进行回顾。

Socket

socket可以算是ip网络开发的基石,虽然古老,但所有目前主流的高层应用框架底层实现都是基于socket的开发。详细了解socket知识可以访问https://blog.csdn.net/httpdrestart/article/details/80670388
对socket的简单理解可以认为,服务端开个监听,客户端连接访问,数据交互和结束。具体步骤为:Socket就是该模式的一个实现socket是建立服务端和客户端的链接,服务端在自身网卡某一ip地址的某个端口(bind)进行监听(listen),客户端向服务端ip和端口进行连接申请(connect),服务端接受客户端的连接申请(accept),服务端建立客户端句柄(handle),双方可以进行通信(read、write),单一一方结束通信(close)则完成通信。详见下图:

浅析Socket、HTTP、SOAP、Restful、PHP、JSP、H5演变和区别(一)_第1张图片
socket非常高效,除支持TCP、UDP的网络通信外,(AF_INET(IPV4)、AF_INET6(IPV6))还支持进程间通信(AF_LOCAL),AF_LOCAL在单台主机不同进程间,采用文件名为唯一地址进行连接和数据交换,在很多高效的linux组件中都有用到。
socket经常提到的应该是TCP三次握手,在这里可以很好的再回顾一下实现原理。

TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake),过程如下图所示。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

一个完整的三次握手也就是: 请求—应答—再次确认。

对应的函数接口:
浅析Socket、HTTP、SOAP、Restful、PHP、JSP、H5演变和区别(一)_第2张图片

再进一步的了解可以查询https://blog.csdn.net/httpdrestart/article/details/80670388

HTTP

socket如火如荼,建立了整个C/S的程序框架,由于socket只规定了连接和读取,至于读取内容格式都由程序自己决定,使得socket开发非常灵活,大神可以开发出非常高效的程序,为简化socket开发难度,后期有大神针将socket函数进行面向对象封装,加入消息机制,使得调用变得简单。
但成也萧何败萧何。随着用户业务系统越来越多,系统间交互需求越来越旺盛,socket的强大和对传输内容的非约束性,造成不同系统之间原有业务协议打通困难,这时大家更希望能产生一个开放的、安全的大家可以相互通信和信息互相访问的协议。于是HTTP出现,并将C/S时代变革为B/S时代。
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。详细了解可以阅读http://www.cnblogs.com/ranyonsue/p/5984001.html。

HTTP底层通过socket完成,只不过客户端是由浏览器封装,服务器端是由Web服务器提供(httpd、tomcat等)。
HTTP主要要理解其报文结构,对后续开发和调试以及HTTP访问路径理解有益。

HTTP之请求消息Request
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

•请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。

下面我们用google chrome访问baidu看看HTTP的秘密。
在百度搜索中输入HTTP_secret的秘密,在network中可以看到请求报文为:

GET /s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=HTTP_secret&oq=HTTP%25E7%259A%2584%25E7%25A7%2598%25E5%25AF%2586&rsv_pq=f1eebc410004d838&rsv_t=bf97ykYCD1n5eoFpOu9XQyugQrMRRAvdN8Af3gJ%2FPQaUZh9QUlJ%2F9L%2FX9h4&rqlang=cn&rsv_enter=0&rsv_n=2&rsv_sug3=1&inputT=666&rsv_sug4=665 HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=F96A65B642C1AB6717ACA0DCD649F527; PSTM=1501233284; MCITY=-315%3A; BAIDUID=E3A483426B53398AD9DDD7D7BDB093BF:FG=1; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; BD_CK_SAM=1; PSINO=1; H_PS_PSSID=1465_21085_26350; ispeed_lsm=2; H_PS_645EC=0ee5MRSiLoNVZOrCu1emBF7lev2jgWZg8E6X%2BjLh0jNFuAkNgWp5iz73czo; BDSVRTM=162

第一行为请求行,GET请求,请求资源为/562f25980001b1b106000338.jpg,HTTP的版本为1.1
第一行之后为请求头,用于传递附加信息,这里主要的信息有User-Agent(浏览器类型,用于后台针对不同浏览器进行处理),Cookie。
第三部分:空行,请求头部后面的空行是必须的
即使第四部分的请求数据为空,也必须有空行。
第四部分:请求数据也叫主体,可以添加任意的其他数据。如在post时添加参数,在soap时添加内容,在soap时进行讲解。本例子由于使用get,参数放到了资源里,请求数据为空。

POST请求例子,使用Charles抓取的request:

POST / HTTP1.1 #请求行
Host:www.wrox.com #请求头开始
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive #请求头结束
#空行分割
name=Professional%20Ajax&publisher=Wiley#主体

再看一下Response,也是由四个部分组成,分别是:状态行、消息报头、空行和响应正文。基本和Request结构类似,可以按以下baidu返回结果学习。

HTTP/1.1 200 OK #状态行
Date: Thu, 30 Aug 2018 08:45:07 GMT #消息报头开始
Content-Type: text/html
Transfer-Encoding: chunked
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=471FF6596A92CC77D2FDBD5CC44DDD52:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=471FF6596A92CC77D2FDBD5CC44DDD52; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1535618707; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: delPer=0; expires=Sat, 22-Aug-2048 08:45:07 GMT
Set-Cookie: BDSVRTM=10; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cxy_all: baidu+03d0a088fe9f9855bfe90226c09f010f
Cache-Control: private
Expires: Thu, 30 Aug 2018 08:45:07 GMT
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 1
BDQID: 0xabf4027c0000dc97 #消息报头结束
#空行分割
#主体

其中比较重要的参数有:
1、状态行返回结果,200表示正常返回。
2、Set-Cookie,服务器对cookie设值,服务器可以将sessionid设值到cookie中,这样便于下次请求时识别为同一用户。
再详细的学习可以参考http://www.cnblogs.com/ranyonsue/p/5984001.html

SOAP

相对于基于socket的C/S架构,HTTP的B/S架构有着明显优势。HTTP不光规范了底层连接,更加制定了传输内容结构。防火墙很容易识别是否是HTTP请求,这样可以很好的实现传输的安全,HTTP头和体分离结构,便于HTTP转发
便,从而可以实现跨网段、跨防火墙访问。可以通过通用的方法实现不同主机在不同网络上通过互联网防火墙可以实现数据安全交互和对外安全服务。这些都是C/S架构不可比拟的。
但通常理解的HTTP还是以网页浏览为主体,既然HTTP那么容易实现防火墙穿越,那能不能把业务的操作和数据的传输也基于HTTP呢,这样就出现了SOAP。
SOAP简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME),基于“通用”传输协议是 SOAP的一个优点。它还支持从消息系统到远程过程调用(Remote Procedure Call,RPC)等大量的应用程序。SOAP提供了一系列的标准,如WSRM(WS-ReliableMessaging)形式化契约确保可靠性与安全性,确保异步处理与调用;WS-Security、WS-Transactions和WS-Coordination等标准提供了上下文信息与对话状态管理。
简单的理解就是SOAP基于HTTP包结构,将自己作为xml放入HTTP的包主体中。既然SOAP是以XML形似存在,我们可以把SOAP理解成一个信封,把我们要传递的内容和操作打包到这个信封中,变成XML再放入到HTTP体中,就可以实现类似HTTP的传输。
Soap基础学习可以直接看 http://www.w3school.com.cn/soap/index.asp,内容比较详尽。
我们以个查看手机归属的例子看一下。
例子可以在http://www.webxml.com.cn/zh_cn/web_services.aspx找到。可以通过SoapUI工具进行测试。

Request如下:

#HTTP头省略,和标准头一样,只是Content-Type: application/soap+xml; charset=utf-8

#HTTP包体 内装了soap信封
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://WebXml.com.cn/">
   <soap:Header/>
   <soap:Body>
      <web:getMobileCodeInfo>
         
         <web:mobileCode>1589901web:mobileCode>#手机号码头7位参数
         
         <web:userID>web:userID>#用户ID
      web:getMobileCodeInfo>
   soap:Body>
soae>

Response如下:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">
         <getMobileCodeInfoResult>1589901:新疆 库尔勒 新疆移动全球通卡getMobileCodeInfoResult>
      getMobileCodeInfoResponse>
   soap:Body>
soap:Envelope>

写了一天,刚刚突然浏览器坏了,差点前功尽弃,先写到这,后面再继续写。

你可能感兴趣的:(浅析Socket、HTTP、SOAP、Restful、PHP、JSP、H5演变和区别(一))