您的位置:首页 > 理论基础 > 计算机网络

http原理

2016-01-31 11:21 471 查看
2012年05月19日 ⁄ 综合 ⁄ 共 5504字 ⁄ 字号 小 中 大 ⁄ 评论关闭

网络通信层次图




 

TCP报文段格式

 


 

建链过程中的“三次握手”

 



 

1、SYN(Synchronize Sequence Numbers)是TCP是传输控制协议中的一个标志位。如果该位被置为1,则表示这个报文是一个请求建立连接的报文。 

2、ACK(ACKnowledge Character)中文:确认字符。也是TCP是传输控制协议的一个标志位。在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。是一个用于确认的报文。

 

关闭链路的四次握手

 



1、FIN(finish) 结束,没有更多的数据发送

 





 Http请求协议

GET /img/iknow/msg/msg.gif HTTP/1.1

Accept: */*

Referer: http://zhidao.baidu.com/

Accept-Language: zh-CN

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.5.1277.202; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C)

Accept-Encoding: gzip, deflate

Host: img.baidu.com

Connection: Keep-Alive 

Http响应

HTTP/1.1 200 OK

Content-Type: image/gif

ETag: "1068122120"

Accept-Ranges: bytes

Last-Modified: Mon, 19 Dec 2011 08:00:44 GMT

Expires: Wed, 13 Jul 2022 12:27:55 GMT

Cache-Control: max-age=311040000

Content-Length: 1141

Date: Mon, 03 Sep 2012 12:27:55 GMT

Server: BWS/1.0

-----------------------------------------------------------------

HTTP/1.1 状态码 错误信息

Content-Type:  (类型)

Content-length:(包体长度)

HttpURLConnection Get请求 


1     /**
2      * 1、android模拟器(simulator)把它自己作为了localhost,也就是说,代码中使用localhost或者127.0.0.1来访问,
3      *          都是访问模拟器自己!
4      * 2、如果想在模拟器simulator上面访问你的电脑,那么就使用android内置的IP 10.0.2.2 ,
5      *    10.0.2.2 是模拟器设置的特定ip,是你的电脑的别名alias
6      * 3、记住,在模拟器上用10.0.2.2访问你的电脑本机
7      */
8     private final String baseUrl = "http://10.0.2.2:8080/WebProj/main.jsp";
9
10     //HttpURLConnection Get请求
11      btnHttpURLConnection_Get.setOnClickListener(new OnClickListener()
12      {
13          @Override
14          public void onClick(View v)
15          {
16              InputStream is = null;
17              HttpURLConnection httpUrlConn = null;
18              try
19              {
20                  String strAccountNumber = etAccountNumber.getText().toString();
21                  String strPwd = etPwd.getText().toString();
22                  StringBuffer sbUrl = new StringBuffer();
23
24                  //http://10.0.2.2:8080/WebProj/main.jsp?textAccountNumber=abc&textPwd=123
25                  sbUrl
26                      .append(baseUrl)
27                      .append("?textAccountNumber=")
28                      //注意如果参数是中文,要做以下处理
29                      .append(URLEncoder.encode(strAccountNumber, "utf-8"))
30                      .append("&textPwd=")
31                      .append(strPwd);
32
33                  URL url = new URL(sbUrl.toString());
34                  //打开连接
35                  httpUrlConn = (HttpURLConnection) url.openConnection();
36                  //获取连接状态
37                  int rc = httpUrlConn.getResponseCode();
38
39                  //连接成功
40                  if(rc == HttpURLConnection.HTTP_OK)
41                  {
42                      //获取数据,先得到输入流
43                      is = httpUrlConn.getInputStream();
44
45                      BufferedReader buffer = new BufferedReader(new InputStreamReader(is,"gbk"));
46                      String inputLine = null;
47                      StringBuffer sbContent = new StringBuffer();
48
49                      while ((inputLine = buffer.readLine()) != null)
50                      {
51                          sbContent.append(inputLine + "\n");
52                      }
53
54                      //获取到的内容转换成 GBK 编码,防止中文乱码
55                      //String strContent = new String(sbContent.toString().getBytes("iso-8859-1"), "gbk");
56                      tvContent.setText(sbContent.toString());
57                      buffer.close();
58                      buffer = null;
59                  }
60              }
61              catch (MalformedURLException e)
62              {
63                  e.printStackTrace();
64              }
65              catch (IOException e)
66              {
67                  e.printStackTrace();
68              }
69              finally
70              {
71                  if(is != null)
72                  {
73                      try
74                      {
75                          is.close();
76                          is = null;
77                      }
78                      catch (IOException e)
79                      {
80                          e.printStackTrace();
81                      }
82                  }
83
84                  if(httpUrlConn != null)
85                  {
86                      //关闭连接
87                      httpUrlConn.disconnect();
88                      httpUrlConn = null;
89                  }
90              }
91          }
92      });




 

HttpURLConnection Post请求


1     /**
2      * 1、android模拟器(simulator)把它自己作为了localhost,也就是说,代码中使用localhost或者127.0.0.1来访问,
3      *          都是访问模拟器自己!
4      * 2、如果想在模拟器simulator上面访问你的电脑,那么就使用android内置的IP 10.0.2.2 ,
5      *    10.0.2.2 是模拟器设置的特定ip,是你的电脑的别名alias
6      * 3、记住,在模拟器上用10.0.2.2访问你的电脑本机
7      */
8     private final String baseUrl = "http://10.0.2.2:8080/WebProj/main.jsp";
9
10
11     //HttpURLConnection Post请求
12     btnHttpURLConnection_Post.setOnClickListener(new OnClickListener()
13     {
14         @Override
15         public void onClick(View v)
16         {
17             DataOutputStream dos = null;
18             InputStream is = null;
19             HttpURLConnection httpUrlConn = null;
20             try
21             {
22                 String strAccountNumber = etAccountNumber.getText().toString();
23                 String strPwd = etPwd.getText().toString();
24                 URL url = new URL(baseUrl);
25                 //获取一个连接
26                 httpUrlConn = (HttpURLConnection) url.openConnection();
27                 //允许连接输出
28                 httpUrlConn.setDoOutput(true);
29                 //允许连接输入
30                 httpUrlConn.setDoInput(true);
31                 //设置以 POST 方式发送请求
32                 httpUrlConn.setRequestMethod("POST");
33                 //设置 POST 请求不能使用缓存
34                 httpUrlConn.setUseCaches(false);
35                 //设置这个连接是否可以重定向
36                 httpUrlConn.setInstanceFollowRedirects(true);
37                 //设置请求头的域的值
38                 //配置本连接的 CONTENT_TYPE 为 application/x-www-form-urlencoded
39                 httpUrlConn.setRequestProperty(HTTP.CONTENT_TYPE, URLEncodedUtils.CONTENT_TYPE);
40                 //连接,所有的配置信息要 connect() 方法前完成,httpUrlConn.getOutputStream 会隐含地进行 connect
41                 httpUrlConn.connect();
42                 //构造请求包体的内容
43                 StringBuffer sbParam = new StringBuffer();
44                 //textAccountNumber=abc&textPwd=123
45                 sbParam
46                     .append("textAccountNumber=")
47                     .append(URLEncoder.encode(strAccountNumber, "gbk"))
48                     .append("&textPwd=")
49                     .append(URLEncoder.encode(strPwd, "gbk"));
50                 //获取连接的输出流
51                 dos = new DataOutputStream(httpUrlConn.getOutputStream());
52                 //将参数写入输出流
53                 dos.writeBytes(sbParam.toString());
54                 dos.flush();
55                 dos.close();
56                 dos = null;
57
58
59                 //获取连接状态,当执行 getInputStream() 时,才将输出流中的数据发送出去
60                 int rc = httpUrlConn.getResponseCode();//HttpURLConnection.HTTP_OK;
61                 System.out.println("httpUrlConn.getResponseCode()=" + rc);
62                 //连接成功
63                 if(rc == HttpURLConnection.HTTP_OK)
64                 {
65                     //获取数据
66                     is = httpUrlConn.getInputStream();
67
68                     BufferedReader buffer = new BufferedReader(new InputStreamReader(is,"gbk"));
69                     String inputLine = null;
70                     StringBuffer sbContent = new StringBuffer();
71
72                     while ((inputLine = buffer.readLine()) != null)
73                     {
74                         sbContent.append(inputLine + "\n");
75                     }
76
77                     tvContent.setText(sbContent.toString());
78                     buffer.close();
79                     buffer = null;
80                 }
81             }
82             catch (MalformedURLException e)
83             {
84                 e.printStackTrace();
85             }
86             catch (IOException e)
87             {
88                 e.printStackTrace();
89             }
90             finally
91             {
92                 if(dos != null)
93                 {
94                     try
95                     {
96                         dos.close();
97                         dos = null;
98                     }
99                     catch (IOException e)
100                     {
101                         e.printStackTrace();
102                     }
103                 }
104
105                 if(is != null)
106                 {
107                     try
108                     {
109                         is.close();
110                         is = null;
111                     }
112                     catch (IOException e)
113                     {
114                         e.printStackTrace();
115                     }
116                 }
117
118                 if(httpUrlConn != null)
119                 {
120                     //关闭连接
121                     httpUrlConn.disconnect();
122                     httpUrlConn = null;
123                 }
124             }
125         }
126     });




 

 

 


Android之Http通信——1.初识Http协议

Android之Http通信1初识Http协议 引言 正文 Http是什么鬼 名词解析 Http 10 与 Http 11的区别 Http请求的工作流程 Http请求的几种方式 Http状态码合集 Http协议的特点 OSI七层协议TCP四层协议 总结



1.Http是什么?


①名词解析:

hypertext transfer protocol(超文本传输协议),TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。


②Http 1.0 与 Http 1.1的区别:

1.0协议,客户端与web服务器建立连接后,只能获得一个web资源! 1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源!

PS:现在大部分的都是用的Http 1.1协议的~


③Http请求的工作流程:

这里先介绍两个名词,SYN和ACK

SYN(synchronous):TCP/IP建立连接时使用的握手信号 ACK(Acknowledgement):确认字符,确认发来的数据已经接受无误

接着说下TCP/IP三次握手的概念:

客户端发送syn包(syn = j)到服务器,进入SYN_SEND状态,然后等待服务器确认 服务器收到syn包,确认客户的syn(ack = j + 1),同时在自己也发送一个SYN包(syn=k),

即SYN + ACK包,服务器进入SYN_RECV状态 客户端收到SYN + ACK包,想服务器发送确认包ACK(ack = k +1),发送完毕后,客户端与服务端

进入ESTABLISHED状态,完成三次握手,然后两者开始传送数据

如果你觉得复杂的话,看图想想你就有个大概印象了,三次握手示意图如下:



Http操作的流程:

用户点击浏览器上的url(超链接),Web浏览器与Web服务器建立连接 建立连接后,客户端发送请求给服务器,请求的格式为:

统一资源标识符(URL)+协议版本号(一般是1.1)+MIME信息(多个消息头)+一个空行 服务端受到请求后,给予相应的返回信息,返回格式为:

协议版本号 + 状态行(处理结果) + 多个信息头 + 空行 + 实体内容(比如返回的HTML) 客户端接收服务端返回信息,通过浏览器显示出来,然后与服务端断开连接;当然如果中途某步发生错误的话,错误信息会返回到客户端,并显示,比如:经典的404错误

好吧,No pic you say a jb,有图有真相,下面我们用HttpWatch来抓下包(当然,你也可以直接用Chrome f12),这里测试的网站是小猪学校的教务系统:输入账号密码后,发送登陆请求,相关信息头,至于相关的信息头,我们下节再详细讲解~:

HTTP请求包含的内容:



HTTP响应包括的内容:




④Http请求的几种方式:

我们看到上面我们发送http请求的方式是POST,它和GET在我们平时开发中使用较多,下面我们就罗列出所有的请求方式吧:

Get:请求获取Request-URI所标识的资源 POST:在Request-URI所标识的资源后附加新的数据 HEAD 请求获取由Request-URI所标识的资源的响应信息报头 PUT:请求服务器存储一个资源,并用Request-URI作为其标识 DELETE:请求服务器删除Request-URI所标识的资源 TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断 CONNECT:保留将来使用 OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项

好吧,除了GET和POST其他的,笔者也没用过,所以,这里只区分GET和POST的区别:

GET:在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,但数据容量通常不能超过2K,比如:http://xxx?username=…&pawd=…这种就是GET POST: 这个则可以在请求的实体内容中向服务器发送数据,传输没有数量限制 另外要说一点,这两个玩意都是发送数据的,只是发送机制不一样,不要相信网上说的”GET获得服务器数据,POST向服务器发送数据”!!

另外GET安全性非常低,Post安全性较高,但是执行效率却比Post方法好,一般查询的时候我们用GET,数据增删改的时候用POST!!


⑤Http状态码合集:

100~199 : 成功接受请求,客户端需提交下一次请求才能完成整个处理过程 200: OK,客户端请求成功 300~399:请求资源已移到新的地址(302,307,304) 401:请求未授权,改状态代码需与WWW-Authenticate报头域一起使用 403:Forbidden,服务器收到请求,但是拒绝提供服务 404:Not Found,请求资源不存在,这个就不用说啦 500:Internal Server Error,服务器发生不可预期的错误 503:Server Unavailable,服务器当前不能处理客户端请求,一段时间后可能恢复正常


⑥Http协议的特点

好吧,这些东西知道就可以了,小猪就不自己慢慢扣了,直接复制粘贴哈~

支持客户/服务器模式。 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每 次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。


⑦OSI七层协议&TCP四层协议;

恩,这个我们知道就可以了,后续有需要的话再深入了解,我们的HTTP请求是出于第七层:应用层的,

大家知道就可以了,另外最好记下这七层,对了,一到三层是用于创建两个网络设备间的物理连接的,

而四到七层主要负责互操作性,背熟就好,面试说不定问下呢,是吧,哈哈~

OSI七层协议图&TCP四层模型图:



另外小猪查相关资料的时候,发现一个B格更高的总结图,有兴趣的可以慢慢研究:



贴下原文链接,想刨根问底的可以看下:

OSI七层模型详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android http