https websocket 不通怎么支持https

Android 通过 https ssl 方式连接服务端的配置方式 - 为程序员服务
Android 通过 https ssl 方式连接服务端的配置方式
写android app, 通常需要与服务端通讯获取数据, 而这些数据的传输通常是通过HTTPS 协议来完成的,说白了也就是 http + ssl 来完成的, 从服务端的角度来说,与开发无关,只与application server 的配置相关, 下面的这个文档详细说明了,如何用android app 通过https 方式连接服务端.
Eclipse3.7
Tomcat 6.0.18(免安装版)
Android2.1开发环境(在Eclipse中配置好)
JDK环境要使用我们自己安装的,笔者JDK安装目录为D:\Java\jdk1.6.0_22,在Eclipse的Window-preference-installed JREs中,只选用我们自己安装的JRE,如图所示:
在Eclipse与Tomcat整合的时候,也需要选择此运行环境:
一.搭建服务器端
1.在Eclipse中新建Dynamic Web Project,取名为HttpsServer:
2.index.jsp内容如下:
&%@ page language=&java& import=&java.util.*& pageEncoding=&UTF-8&%&
&&& String path = request.getContextPath();
&&& String basePath = request.getScheme() + &://&
&&&&&&&&&&& + request.getServerName() + &:& + request.getServerPort()
&&&&&&&&&&& + path + &/&;
&!DOCTYPE HTML PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN&&
&base href="/article/android/&&%=basePath%&&&
&title&name+age JSP Page&/title&
&meta http-equiv=&pragma& content=&no-cache&&
&meta http-equiv=&cache-control& content=&no-cache&&
&meta http-equiv=&expires& content=&0&&
&meta http-equiv=&keywords& content=&keyword1,keyword2,keyword3&&
&meta http-equiv=&description& content=&This is my page&&
&&&&&& &form action=&/HttpsServer/TestService& method=&get&&
&&&&&& &&&&&& name:&&input name=&name& type=&text& /&&br /& age: &&input
&&&&&& &&&&&& &&&&&& name=&age& type=&text& /&&br /& &input type=&submit& value=&submit& /&&&&&&&input
&&&&&& &&&&&& &&&&&& type=&reset& value=&reset& /&
&&&&&& &/form&
&&&&&& &form action=&/HttpsServer/TestService& method=&post&&
&&&&&&& name:&&input name=&name& type=&text& /&&br /& age: &&input
&&&&&&&&&&& name=&age& type=&text& /&&br /& &input type=&submit& value=&submit& /&&&&&&&input
&&&&&&&&&&& type=&reset& value=&reset& /&
&&& &/form&
这里其实是复用了之前Http调研的代码,我们关心的是我们手机端能不能访问该服务器端,还涉及到传递数据,具体数据显示在TestService表示。
3.TestService代码如下:
package com.
import java.io.IOE
import java.io.PrintW
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
public class TestService extends HttpServlet {
&&& private static final long serialVersionUID = 1L;
&&& protected void doGet(HttpServletRequest req, HttpServletResponse resp)
&&&&&&&&&&& throws ServletException, IOException {
&&&&&&& String name = req.getParameter(&name&);
&&&&&&& String age = req.getParameter(&age&);
&&&&&&& resp.setContentType(&text/html&);
&&&&&&& PrintWriter out = resp.getWriter();
&&&&&&& out.println(&&html&&head&&title&name&age&/title&&/head&);
&&&&&&& out.println(&&body& name:& + name + &&br&&);
&&&&&&& out.println(&age:& + age + &&br&&/body&&/html&&);
&&&&&&& System.out.println(&name=& + name);
&&&&&&& System.out.println(&age=& + age);
&&&&&&& out.flush();
&&& protected void doPost(HttpServletRequest req, HttpServletResponse resp)
&&&&&&&&&&& throws ServletException, IOException {
&&&&&&& req.setCharacterEncoding(&utf-8&);
&&&&&&& String name = req.getParameter(&name&);
&&&&&&& String age = req.getParameter(&age&);
&&&&&&& resp.setContentType(&text/html&);
&&&&&&& resp.setCharacterEncoding(&utf-8&); // 设置返回给客户端的文本格式,可解决文字编码不统一的问题
&&&&&&& PrintWriter out = resp.getWriter();
&&&&&&& out.println(&&html&&head&&title&name&age&/title&&/head&);
&&&&&&& out.println(&&body& name:& + name + &&br&&);
&&&&&&& out.println(&age:& + age + &&br&&/body&&/html&&);
&&&&&&& System.out.println(&name=& + name);
&&&&&&& System.out.println(&age=& + age);
&&&&&&& out.flush();
4.修改web.xml文件,在倒数第二行加入:
&&& &description&This is the description of my J2EE component&/description&
&&& &display-name&This is the display name of my J2EE component&/display-name&
&&& &servlet-name&TestService&/servlet-name&
&&& &servlet-class&com.veer.TestService&/servlet-class&
& &/servlet&
&servlet-mapping&
&&& &servlet-name&TestService&/servlet-name&
&&& &url-pattern&/TestService&/url-pattern&
& &/servlet-mapping&
至此,未加密钥的服务器端就已经搭建好。
二.配置密钥
2.1 在D盘建立文件夹cer,再在里面建立文件夹tomcat;
2.2 进入cmd,依次键入cd\、d:、cd cer、cd tomcat,进入到D:\cer\tomcat目录下面;
2.3 生成服务器端密钥
键入D:\cer\tomcat&
keytool -genkey -alias tomcat -keyalg RSA -keystore server.keystore -validity 36000
解释:keytool是jdk下的命令行工具。
alias 随意指定,表示别名。keyalg表示加密算法为RSA,输出文件为server.keystore
这里面需要输入密码(我们输入123456),另外注意&您的名字与姓氏是什么?&,这一项要输入tomcat所在主机的IP或域名,客户端访问tomcat时会涉及到这个地址,笔者局域网的IP是192.168.1.213,所以我们输入该IP。
此时在D:\cer\tomcat里面就会生成一个server.keystore文件,不要关闭cmd,还有操作要进行;
2.4 用server.keystore生成server.cer
键入:D:\cer\tomcat&
keytool -export -alias tomcat -file server.cer -keystore server.keystore -storepass 123456
此时在D:\cer\tomcat里面就会生成一个server.cer文件。解释:这个是浏览器可以识别的证书,用于导入浏览器。
不要关闭cmd,还有操作要进行。
2.5 这个时候tomcat就可以启动ssl了,以tomcat6.0为例,在server.xml中拷入(或是更改)如下片段:
&Connector SSLEnabled=&true& acceptCount=&100& clientAuth=&false& disableUploadTimeout=&true& enableLookups=&true& keystoreFile=&D:/cer/tomcat/server.keystore& keystorePass=&123456& maxSpareThreads=&75& maxThreads=&200& minSpareThreads=&5& port=&8443& protocol=&org.apache.coyote.http11.Http11NioProtocol& scheme=&https& secure=&true& sslProtocol=&TLS&/&
其中clientAuth=&false& ,表示单向验证,为true的话则是双向认证。
这时启动tomcat,打开IE,输入https://192.168.1.213:8443/ 会提示没有证书,但能点进去。
我们可以双击刚才生成的server.cer,把它导入&受信任的根证书颁发机构&,就能看到浏览器上的小锁了。
三.特别说明
我们需要下载bcprov-jdk15-135.jar及sunjce_provider.jar(可能已经存在),放入D:\Java\jdk1.6.0_22\jre\lib\ext下面。同时要修改D:\Java\jdk1.6.0_22\j\jre\lib\security\java.security文件,
找到security.provider.1=sun.security.provider.Sun这行,这里有好几行,在最后一行加上security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider,笔者本来有9号,所以新一行的序号为10。
在cmd中继续键入:D:\cer\tomcat&
keytool -import -alias tomcat -file server.cer -keystore server_trust.keystore -storepass 123456 -storetype BKS -providername &BC&
这时候在D:\cer\tomcat里面就会生成一个server_trust.keystore文件。
解释:将在客户端用到这个信任的密钥。
四.搭建客户端
按照正常的步骤,我们建立一个Android Project,需要注意的是新建立一个文件夹res/raw,将server_trust.keystore拷贝至其中,在AndroidMainfest.xml中加入。如下图所示:
HttpsClientActivity 代码如下:
package com.
import java.io.InputS
import java.security.KeyS
import org.apache.http.HttpE
import org.apache.http.HttpR
import org.apache.http.client.HttpC
import org.apache.http.client.methods.HttpG
import org.apache.http.client.methods.HttpUriR
import org.apache.http.conn.scheme.S
import org.apache.http.conn.ssl.SSLSocketF
import org.apache.http.impl.client.DefaultHttpC
import android.app.A
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
public class HttpsClientActivity extends Activity {
&&& /** Called when the activity is first created. */
&&& private Button testB
&&& private String httpsUrl = &https://192.168.1.213:8443/HttpsServer/TestService&;
&&& HttpClient hc = new DefaultHttpClient();
&&& @Override
&&& public void onCreate(Bundle savedInstanceState) {
&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& setContentView(R.layout.main);
&&&&&&& testButton = (Button) findViewById(R.id.testButton);
&&&&&&& testButton.setOnClickListener(new OnClickListener() {
&&&&&&&&&&& @Override
&&&&&&&&&&& public void onClick(View v) {
&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&& initKey();
&&&&&&&&&&&&&&& } catch (Exception e) {
&&&&&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&& &&try {
&&&&&&&&&&&&&&&&&&& String result = getData(httpsUrl);
&&&&&&&&&&&&&&&&&&& System.out.println(&result=& + result);
&&&&&&&&&&&&&&& } catch (Exception e) {
&&&&&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&& });
&&& private void initKey() throws Exception {
&&&&&&& KeyStore trustStore = KeyStore.getInstance(&BKS&);
&&&&&&& trustStore.load(
&&&&&&&&&&&&&&& getBaseContext().getResources().openRawResource(
&&&&&&&&&&&&&&&&&&&&&&& R.raw.server_trust), &123456&.toCharArray());
&&&&&&& SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
&&&&&&& Scheme sch = new Scheme(&https&, socketFactory, 8443);
&&&&&&& hc.getConnectionManager().getSchemeRegistry().register(sch);
&&& private String getData(String url) throws Exception {
&&&&&&& HttpUriRequest hr = new HttpGet(url);
&&&&&&& HttpResponse hres = hc.execute(hr);
&&&&&&& HttpEntity he = hres.getEntity();
&&&&&&& InputStream is = he.getContent();
&&&&&&& StringBuffer sb = new StringBuffer();
&&&&&&& byte[] bytes = new byte[1024];
&&&&&&& for (int len = 0; (len = is.read(bytes)) != -1;) {
&&&&&&&&&&& sb.append(new String(bytes, 0, len, &utf-8&));
&&&&&&& return sb.toString();
main.xml代码如下:
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
&&& android:layout_width=&fill_parent&
&&& android:layout_height=&fill_parent&
&&& android:orientation=&vertical& &
&&& &Button
&&&&&&& android:id=&@+id/testButton&
&&&&&&& android:layout_width=&fill_parent&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:text=&HTTPS Test& /&
&/LinearLayout&
将该Android项目运行起来,点击按钮,在logcat中就可以看到打印信息:
在console控制台中可以看到信息:
至迟,手机端对https服务器简单的访问已经完成,至于其他的具体功能还要靠大家自己去扩展和封装。
原文地址:, 感谢原作者分享。
您可能感兴趣的代码如何利用socket进行HTTP访问&平常我们要访问某个URL一般都是通过浏览器进行:提交一个URL请求后,浏览器将请求发向目标服务器或者代理服务器,目标服务器或者代理服务器返回我们所需要的数据,浏览器接收到这些数据后保存成文件并进行显示。&下面我们看看如何自己利用winsock2.h中的接口来实现这个功能?为了简化问题,作以下假设:&通过代理服务器进行HTTP访问,这样就省去了对URL进行DNS解析的步骤,假设代理服务器的地址为:192.168.0.1:808。&&&这个功能由以下几个部分组成:&1.&如何建立连接?&2.&如何发送请求?&3.&如何接收数据?&4.&如何判断数据接收完成?&&&下面我们依次来看下这些问题如何解决&一、如何建立与服务器之间的连接&HTTP基本TCP,所以我们需要与服务器建立连接,然后才能发送数据。&建立连接参考如下函数socket_open:&
int&socket_open(int&IP,int&Port,int&type){
SOCKET socketId;
&struct&sockaddr_in serv_
&socketId=socket(AF_INET,SOCK_STREAM,0);
&if((int)socketId&0)
&&&&&&&printf("[ERROR]Create a socket failed!\n");
&&&&&&&return&-1;
&memset(&serv_addr,0,sizeof(serv_addr));
&serv_addr.sin_family=AF_INET;
&serv_addr.sin_addr.s_addr = ntohl(IP);&
&serv_addr.sin_port = htons((USHORT)Port);
&status=connect(socketId,(struct&sockaddr*)&serv_addr,sizeof(serv_addr));
&&&&if(status!=0)
&&&&printf("[ERROR]Connecting failed!\n");&
&&&&closesocket(socketId);
&&&&return&-1;
&return&socketId;
&调用方式如下:&
int&socketId=socket_open(0xC0A);&
二、如何发送请求&发送数据要根据HTTP协议的要求附加协议头:&
static&const&char* protocolHead="GET&&HTTP/1.1\n"
&&&&&"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\n"
&&&&&"Accept-Language: zh-cn\n"
&&&&&"User-Agent:iPanelBrowser/2.0\n"
&&&&&"Host: :80\n"
&&&&&"Connection: close\n\n"
&&&&&&这里使用GET来获取指定URL的指定文档。&&&&&&建立连接后使用send将这些数据发送出去:&&&&&&send(socketId,&protocolHead,strlen(protocolHead),0);&&&&&&发送完成HTTP请求后就等待接收数据。&&&&&&&&&三、如何接收数据&这里采用select循环查询的方式来判断有无数据到来:&&&
struct&timeval&tm&= {0,7};
&&&&&fd_set fds_r;
&&&&&char&recvBuf[4096]={&\0&};
&&&&&FD_ZERO(&fds_r);
&&&&&FD_SET(socketId,&fds_r);
status=select(socketId+ 1, &fds_r, 0, 0, &tm);&
&&&&&if(status & 0 && FD_ISSET(socketId, &fds_r))
&&&&&&&&&printf("Socket is readable...fd=[%d]\n",socketId);
&&&&&&&&&&recv(socketId,recvBuf,4096,0);
&&&这样数据包就保存到缓冲区中了。&&&四、如何判断数据接收完成&首先对返回数据的状态进行判断,仅当状态为&&HTTP&200&OK&&时才表明正确返回,这时才对数据进行解析并保存,如果状态为HTTP&404&NOT&FOUND或者其它状态则表明没有找到资源或者出现其它问题,可参考HTTP&1.1状态代码及其含义。&当数据正确返回时,为了将实际数据从协议中分离出来进行保存,需要对HTTP数据包进行解析得到Content-Length,然后在包含Content-Length的当前数据包或者随后的数据包中查找第一个空行,这就是内容(Content)的开始位置,再配合前面解析得到的Content-Length,就能够知道什么时候数据接收完成了。换行符为&\r\n&,也兼容&\n&或者&\r&,设换行符为^P,则空行如果位于内容中间或结尾则可查找&^P^P&,若位于开头,则查找^P。&&&基本就是上面这些,这四个问题解决了,那么整个问题也就解决了!
阅读(...) 评论()问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
在网上看到说http连接是短连接而socket连接是长连接,但是http不是也有长连接吗?另外一个问题,socket既然是应用层和传输层之间的一层api,那么每一次建立http连接不是都会使用到socket吗?那socket连接不就是http连接的一部分?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
http协议:处于互联网协议的应用层,角色是规定数据传输的格式
socket: socket称之为套接字,这里的socket指的是http socket, 由主机+端口组成
主机:对应了网络层,涉及ip协议,通过ip确定主机所在位置,主机到主机
端口:涉及互联网协议的传输层,涉及TCP(带有确认机制的UDP协议)/UDP协议,通过端口确认对应的进程,端口其实就是进程使用网卡的编号,端口到端口
整个互联网协议从应用层到实体层,从上到下,越上越接近用户,越下越接近硬件;
所以,首先概念不能混淆,要区分http,socket的职责,http是建立在socket(这里的上下文指的是http socket)之上的,如果你明白了这个,你应该就不会提出来这个问题了。
补充:linux系统中还有一种socket称之为unix domain socket,是通过本地文件进行进程间通信的方式。不同于http socket,是建议在网络协议上的进程间通信方式。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1.HTTP的长连接一般就只能坚持一分钟而已,而且是浏览器决定的,你的页面很难控制这个行为。Socket连接就可以维持很久,几天、数月都有可能,只要网络不断、程序不结束,而且是可以编程灵活控制的。2.HTTP连接是建立在Socket连接之上。在实际的网络栈中,Socket连接的确是HTTP连接的一部分。但是从HTTP协议看,它的连接一般是指它本身的那部分。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
连接的长短跟Socket没有关系,Socket只是操作系统提供给应用程序进行网络通信的抽象API。但是需要理解的是Socket API大多数情况下工作在传输层(偶尔可以工作在数据链路层),这意味着,你可以使用Socket开发基于TCP、UDP等的应用。
HTTP是基于TCP的应用层协议,虽然TCP是支持长连接的,但是HTTP并不强制要求长连接,大部分情况下,一次HTTP请求的完成经过了建立TCP链接-&客户端发送报文-&服务端返回报文-&服务端或客户端关闭此连接这个过程,由于每次都要建立连接,并在完成一次请求响应后关闭连接,所以大家称为“短连接”。HTTP的所谓Keep-Alive,实际上是一种不可控的行为,是为了在一定程度上改善HTTP性能的,即服务端和客户端希望不立刻断开连接,这样下次发送数据时就不需要建立TCP连接了,但是服务端和客户端的任何一方都可以随时断开。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
短连接不总是好的,同样长连接也不总是好的.HTTP是一种以短连接为主,长连接keep-alive为辅被广泛使用的协议.
“HTTP协议是构建在TCP协议之上的,HTTP 1.1中对连接状态默认使用keep-alive方式。这样,在客户端多次请求服务端时,可以复用一个TCP连接,避免频繁建立和断开连接,导致服务端一直等待读取下一个请求而不释放连接。 但同样在我们的服务场景()中不存在TCP连接复用的需求。当一个用户完成一个请求后,希望能够尽快关闭连接。 keep-alive方式导致已完成处理的用户连接不能尽快关闭,连接无法释放,导致连接数不断增加,对服务端的内存和带宽都有影响。”
HTTP keep-alive connection timeouts
Firefox: 约115秒(定义在about:config中的network.http.keep-alive.timeout)
约60秒(可以在注册表中自定义)
默认值75秒(keepalive_timeout 75s)
HTTP 1.1默认启用的HTTP持久连接(keep-alive)能够在keepalive_timeout前省去每次传输报文都要建立TCP连接(三次握手)的时间和开销.
keep-alive期间服务端和客户端的TCP连接状态是ESTABLISHED,执行以下命令可见:
date && sudo netstat -antp |grep "127.0.0.1"|egrep "firefox|nginx"|egrep "ESTABLISHED|WAIT"
i表示不区分大小写,在查一次相当于"AND条件","|"表示"OR条件".
sudo netstat -antp|head -n2 && sudo netstat -antp|grep firefox
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我现在也遇到这个疑惑
请问你怎么理解的??
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:GET跟POST的区别:
get只能传送128K的数据
而post是无限制的
post提交是不在会IE上带上参数
就算你加密了别人也会解密
一般比较重要的数据通过post&传,因为get是别人可以改参数值的
别人乱写参数,你的异常报个不停
网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
其中物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象;
传输层、会话层、表示层和应用层则被称作主机层,是用户所面向和关心的内容。
http协议&&&对应于应用层&&
tcp协议&&&&对应于传输层&&&
ip协议&&&&&对应于网络层&&
三者本质上没有可比性。&&何况HTTP协议是基于TCP连接的。
TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。
&&&我们在传输数据时,可以只使用传输层(TCP/IP),但是那样的话,由于没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用应用层协议,应用层协议很多,有HTTP、FTP、TELNET等等,也可以自己定义应用层协议。WEB使用HTTP作传输层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发送到网络上。
&Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
Http和Socket连接区别
相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助。
1、TCP连接
要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
建立起一个TCP连接需要经过“三次握手”:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)
2、HTTP连接
HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
3、SOCKET原理
3.1套接字(socket)概念
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
3.2 建立socket连接
建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
4、SOCKET连接与TCP连接
创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
5、Socket连接与HTTP连接
由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出.(协议,算是全球定位!)
WWW的核心——HTTP协议
众所周知,Internet的基本协议是TCP/IP协议,目前广泛采用的FTP、Archie Gopher等是建立在TCP/IP协议之上的应用层协议,不同的协议对应着不同的应用。WWW服务器使用的主要协议是HTTP协议,即超文体传输协议。由于HTTP协议支持的服务不限于WWW,还可以是其它服务,因而HTTP协议允许用户在统一的界面下,采用不同的协议访问不同的服务,如FTP、Archie、SMTP、NNTP等。另外,HTTP协议还可用于名字服务器和分布式对象管理。
2.1 HTTP协议简介
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD, POST。每种方法规定了客户与服务器联系的类型不同。&由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
2.2 HTTP协议的几个重要概念
1.连接(Connection):一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。
2.消息(Message):HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
3.请求(Request):一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
4.响应(Response):一个从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如“成功”或“没找到”)和文档的MIME类型。
5.资源(Resource):由URI标识的网络数据对象或服务。
6.实体(Entity):数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。
7.客户机(Client):一个为发送请求目的而建立连接的应用程序。
8.用户代理(User agent):初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。
9.服务器(Server):一个接受连接并对请求返回信息的应用程序。
10.源服务器(Origin server):是一个给定资源可以在其上驻留或被创建的服务器。
11.代理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。
代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
12.网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
13.通道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。
14.缓存(Cache):反应信息的局域存储。
2.3 HTTP协议的运作方式
HTTP协议是基于请求/响应范式的。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理(UA)和源服务器(O)之间通过一个单独的连接来完成(见图2-1)。
当一个或多个中介出现在请求/响应链中时,情况就变得复杂一些。中介由三种:代理(Proxy)、网关(Gateway)和通道(Tunnel)。
一个代理根据URI的绝对格式来接受请求,重写全部或部分消息,通过URI的标识把已格式化过的请求发送到服务器。
网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。
一个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介(例如:防火墙等)或者是中介不能识别消息的内容时,通道经常被使用。图2-2
上面的图2-2表明了在用户代理(UA)和源服务器(O)之间有三个中介(A,B和C)。一个通过整个链的请求或响应消息必须经过四个连接段。这个区别是重要的,因为一些HTTP通讯选择可能应用于最近的连接、没有通道的邻居,应用于链的终点或应用于沿链的所有连接。尽管图2-2是线性的,每个参与者都可能从事多重的、并发的通讯。例如,B可能从许多客户机接收请求而不通过A,并且/或者不通过C把请求送到A,在同时它还可能处理A的请求。
任何针对不作为通道的汇聚可能为处理请求启用一个内部缓存。缓存的效果是请求/响应链被缩短,条件是沿链的参与者之一具有一个缓存的响应作用于那个请求。下图说明结果链,其条件是针对一个未被UA或A加缓存的请求,B有一个经过C来自O的一个前期响应的缓存拷贝。
在Internet上,HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP 80,但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。HTTP只预示着一个可靠的传输。
以上简要介绍了HTTP协议的宏观运作方式,下面介绍一下HTTP协议的内部操作过程。
首先,简单介绍基于HTTP协议的客户/服务器模式的信息交换过程,如图2-4所示,它分四个过程,建立连接、发送请求信息、发送响应信息、关闭连接。
在WWW中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。WWW服务器运行时,一直在TCP80端口(WWW的缺省端口)监听,等待连接的出现。
下面,讨论HTTP协议下客户/服务器模式中信息交换的实现。
1.建立连接连接的建立是通过申请套接字(Socket)实现的。客户打开一个套接字并把它约束在一个端口上,如果成功,就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。
2.发送请求
打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求动作。
HTTP/1.0 请求消息的格式为:
请求消息=请求行(通用信息|请求头|实体头) CRLF[实体内容]
请求 行=方法 请求URL HTTP版本号 CRLF
方 法=GET|HEAD|POST|扩展方法
U R L=协议名称+宿主名+目录与文件名
请求行中的方法描述指定资源中应该执行的动作,常用的方法有GET、HEAD和POST。
不同的请求对象对应GET的结果是不同的,对应关系如下:
对象 GET的结果
文件 文件的内容
程序 该程序的执行结果
数据库查询 查询结果
HEAD——要求服务器查找某对象的元信息,而不是对象本身。
POST——从客户机向服务器传送数据,在要求服务器和CGI做进一步处理时会用到POST方法。POST主要用于发送HTML文本中FORM的内容,让CGI程序处理。
一个请求的例子为:
GET http://networking./zju/index.htm HTTP/1.0
头信息又称为元信息,即信息的信息,利用元信息可以实现有条件的请求或应答 。
请求头——告诉服务器怎样解释本次请求,主要包括用户可以接受的数据类型、压缩方法和语言等。
实体头——实体信息类型、长度、压缩方法、最后一次修改时间、数据有效期等。
实体——请求或应答对象本身。
3.发送响应
服务器在处理完客户的请求之后,要向客户机发送响应消息。
HTTP/1.0的响应消息格式如下:
响应消息=状态行(通用信息头|响应头|实体头) CRLF 〔实体内容〕
状 态 行=HTTP版本号 状态码 原因叙述
状态码表示响应类型
1×× 保留
2×× 表示请求成功地接收
3×× 为完成请求客户需进一步细化请求
4×× 客户错误
5×× 服务器错误
响应头的信息包括:服务程序名,通知客户请求的URL需要认证,请求的资源何时能使用。
4.关闭连接
客户和服务器双方都可以通过关闭套接字来结束TCP/IP对话
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URI
scheme(抽象体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密方法,现在它被广泛用于上安全敏感的通讯,例如交易支付方面。
它是由开发并内置于其中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安全套接字层()作为应用层的子层。(HTTPS使用443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40
位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。
  也就是说它的主要作用可以分为两种:一种是建立一个通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTPS和HTTP的区别
  一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
  二、http是,信息是明文传输,https
则是具有的ssl加密传输协议。
  三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的,比http协议安全。
HTTPS解决的问题
一、信任主机的问题.
  采用https的必须从CA
(Certificate Authority)申请一个用于证明服务器用途类型的证书。该证书只有用于对应的服务器的时候,客户端才信任此主机。所以目前所有的银行系统网站,关键部分应用都是https 的。客户通过信任该证书,从而信任了该主机。其实这样做效率很低,但是银行更侧重安全。这一点对我们没有任何意义,我们的服务器,采用的证书不管是自己发布的还是从公众的地方发布的,其客户端都是自己人,所以我们也就肯定信任该服务器。
二、通讯过程中的数据的泄密和被篡改
  1. 一般意义上的https,就是服务器有一个证书。
  a) 主要目的是保证服务器就是他声称的服务器,这个跟第一点一样。
  b)&和客户端之间的所有,都是加密的。
  i. 具体讲,是客户端产生一个对称的,通过服务器的证书来交换密钥,即一般意义上的握手过程。
  ii. 接下来所有的信息往来就都是加密的。第三方即使截获,也没有任何意义,因为他没有密钥,当然篡改也就没有什么意义了。
  2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书。
  a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码,还有一个CA 认证过的身份。因为个人证书一般来说是别人无法模拟的,所有这样能够更深的确认自己的身份。
  b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘(即U盾)作为一个备份的载体。&[1]
  它的安全保护依赖浏览器的正确实现以及、实际加密算法的支持.
  一种常见的误解是“银行用户在线使用https:就能充分彻底保障他们的银行卡号不被偷窃。”实际上,与服务器的加密连接中能保护银行卡号的部分,只有用户到服务器之间的连接及服务器自身。并不能绝对确保服务器自己是安全的,这点甚至已被攻击者利用,常见例子是模仿银行的钓鱼攻击。少数罕见攻击在网站传输客户数据时发生,攻击者会尝试窃听传输中的数据。
  商业网站被人们期望迅速尽早引入新的特殊处理程序到金融,仅保留传输码(transaction
number)。不过他们常常存储银行卡号在同一个里。那些数据库和服务器少数情况有可能被未授权用户攻击和损害。
  这段仅针对TLS 1.1之前的。因为SSL位于http的下一层,并不能理解更高层协议,通常SSL服务器仅能颁证给特定的IP/端口组合。这是指它经常不能在(基于域名)上与HTTP正常组合成HTTPS。
  这一点已被即将来临的TLS 1.1更新为—种完全支持基于域名的虚拟主机。
  SSL (Secure Socket Layer)
  为Netscape所研发,用以保障在Internet上数据传输之安全,利用(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。目前一般通用之规格为40
bit之安全标准,则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之I.E.或即可支持SSL。
  当前版本为3.0。它已被广泛地用于与服务器之间的身份认证和加密数据传输。
  SSL协议位于与各种应用层协议之间,为提供安全支持。SSL协议可分为两层:SSL记录协议(SSL
Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供、压缩、加密等基本功能的支持。SSL握手协议(SSL
Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL协议提供的服务主要有哪些?
  1)认证用户和服务器,确保数据发送到正确的和服务器
  2)加密数据以防止数据中途被窃取
  3)维护数据的完整性,确保数据在传输过程中不被改变。
SSL协议的工作流程
  服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的后传给服务器;4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让服务器。
用户认证阶段
  在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回()签名后的提问和其公开密钥,从而向服务器提供认证。
  从SSL 协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对信息保密的承诺,这就有利于商家而不利于消费者。在初级阶段,由于运作电子商务的企业大多是信誉较高的大公司,因此这问题还没有充分暴露出来。但随着电子商务的发展,各中小型公司也参与进来,这样在电子支付过程中的单一认证问题就越来越突出。虽然在SSL3.0中通过和可实现浏览器和Web服务器双方的身份验证,但是SSL协议仍存在一些问题,比如,只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。在这种情况下,Visa和MasterCard两大公组织制定了SET协议,为网上信用卡支付提供了全球性的标准。
SSL协议的握手过程
  为了便于更好的认识和理解SSL 协议,这里着重介绍SSL 协议的握手协议。SSL 协议既用到了公钥加密技术又用到了对称加密技术,对称加密技术虽然比公钥加密技术的速度快,可是公钥加密技术提供了更好的。SSL
的握手协议非常有效的让客户和服务器之间完成相互之间的身份认证,其主要过程如下:
  ①客户端的浏览器向服务器传送客户端SSL 协议的,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。
  ②服务器向客户端传送SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。
  ③客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行的CA
是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。
  ④用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。
  ⑤如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。
  ⑥如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的CA 是否可靠,发行CA 的公钥能否正确解开客户证书的发行CA 的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的“预主密码”,然后执行一系列步骤来产生主(客户端也将通过同样的方法产生相同的主通讯密码)。
  ⑦服务器和客户端用相同的主密码即“通话密码”,一个用于SSL
协议的安全数据通讯的加解密通讯。同时在SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。
  ⑧客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。
  ⑨服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。
  ⑩SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:126925次
积分:1631
积分:1631
排名:千里之外
原创:22篇
转载:142篇
(1)(1)(1)(9)(3)(7)(11)(5)(4)(4)(18)(6)(4)(2)(4)(3)(7)(9)(13)(12)(6)(4)(2)(14)(3)(7)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 c socket https 的文章

 

随机推荐