zoukankan      html  css  js  c++  java
  • [C#]网络编程系列专题二:HTTP协议详解

    一、HTTP协议的简介

     HTTP中文为超文本传输协议,从名字上很容易理解,Http协议就是将超文本标记语言的文档(即Html文档)从web服务传送到客户端的浏览器。它属于一个应用层的协议。

     

    二、网络的工作过程

     当用户要访问网络中的某个网页时,大致要经过以下几个步骤:

    1. 用户首先要确定网页文件所在的URL(统一资源定位符,也就是网页在网络上的家庭住址,通过这个地址就可以找到这个网页)如www.cnblogs.com
    2. 浏览器向DNS(域名服务器)发出请求,告诉DNS说:"我要把www.cnblogs.com转化为它所定义的IP地址",这里可以简单把DNS理解为一个字典,知道域名就可以知道域名对于的IP地址,他们有这个一个映射的关系
    3. DNS收到请求后就开始查询,查到后向浏览器返回结果。如域名为www.cnblogs.com对应的IP地址为61.155.169.116
    4. 知道IP地址后, 浏览器向IP地址为61.155.169.116的主机发出与端口号80建议一条TCP连接请求(HTTP协议是建立在传输层TCP的基础上的),80端口是服务器提供web服务的默认端口
    5. 建立连接后,浏览器发出一条HTTP请求,如 GET http://www.cnblogs.com/ HTTP/1.1
    6. 当域名为www.cnblogs.com的服务器接受到请求后,向浏览器发送一个html文件
    7. 文件发送完后,由服务器主动关闭TCP连接。
    8. 浏览器接收传送来的页面并显示
    9. 如果Html文件中包含图片,还要与服务器再次建立一个TCP连接,以便可以下载图片

    上面介绍的步骤中,浏览器发出一个请求后,如何把一个服务器上的HTML文档下载到请求网页的主机上呢? 这个过程就是由HTTP完成,即完成超文本文件的传送,HTTP协议是web服务器的基础。

     

    二、HTTP请求

          Http请求由三部分组成:请求行、请求头和请求数据,一个HTTP请求的格式一般如下:

    请求方法 URL HTTP版本号
    请求头信息
     <一个空行>
    请求数据

    HTTP请求的方法如下表:

    方法

    描述

    Get

    返回URL所指的文档,一般用来请求下载Web网页

    Head

    请求文档头,它类似Get方法,只是Web服务器返回指定文档的首部信息

    Post

    它与Get方法相反,请求服务器接受指定文档,但它不替换已有的文档,只是将新数据附加在它的后面

    Put

    它与Get方法类似,用从客户端传送的数据取代指定文档中的内容,使客户可以向远程Web服务器传送网页等文件

    Delete

    请求服务器删除指定的页面

    Options

    允许客户端查看服务器的性能

    Trace

    用于测试允许客户端查看的消息回收过程

     经常使用的是Get和Post方法,当使用Get方法发出请求时,请求数据为空,所以此时的HTTP请求行就由两部分组成:请求行和请求头信息,下面我们形象看看具体的HttP的实例:

    当在浏览器中地址栏里面输入:www.cnblogs.com,此时我们相当于发出一个HTTP请求,具体为:

    并且从图中可以看出网页中含有图片脚本等文件时,客户端会继续与服务器发出请求,请求所需要的图片和脚本文件。

     

    补充:经一位朋友的留言中,在这里我补充下,现在通常是只建立一个TCP连接,通过HTPP 请求头的Connetion字段来指明,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开,(一些特殊情况除外)当客户端发送另外一个请求时,就使用这条已经建立的连接。

     

    下面介绍下请求头的信息:

    Accept:表示客户端接收的数据类型。例如,Accept:text/html表示客户端可接收HTML类型的文本

    User Agent:表示客户端软件类型

    Referer:表示的是上一连接的url,如跳转到本页面的上一页面url。

     

    上图是一个通过Get方法把一个HTML文件下载到本例浏览器中显示的过程,当我们在博客园主页面点登陆后输入用户名和密码后点确认按钮后,此时我们发出的HTTP的请求是通过Post方法,下面是一个截图:

    从图中可以看出, 通过Post方法发出的HTTP请求中有一个空行(空行后为请求数据),而Get方法发出的请求中没有。

     

    三、HTTP响应

     同样,Http响应也是由三部分组成:状态行,响应头和响应数据组成,Http响应格式如下:

    状态行
    响应头
    <一个空行>
    响应数据

    状态行以HTTP版本号开始,后面跟着3为数字,代表响应代码,响应代码用来告诉客户端,服务器是否产生了预期的响应。如HTTP/1.1 200 OK.

    HTTP/1.1中定义五种响应代码:

    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求

    具体响应代码的说明见下:

    HTTP响应头用于服务器向客户端提供请求文档信息或服务端的状态信息,如图:

    四、总结

    到这里这篇文章也算是说完了,HTTP协议只是应用层中协议的其中之一,应用层还有其他的一些协议,比如FTP(文件传输协议),SMTP(电子邮件协议)等,这些协议在后面都会有所介绍。后面一个专题打算应用HTTP协议的只是自定义一个简单的Web服务器来模拟我们平常在浏览器中输入网址后发送Http请求和服务器返回响应的过程。

  • 相关阅读:
    Ajax学习网址收集
    Crystal Report Download URL and SN
    svn eclipse unable to load default svn client的解决办法
    Effective C++:条款08:别让异常逃离析构函数 (Prevent exceptions from leaving destructors.)
    Effective C++:条款07:为多态基类声明virtual析构函数 (Declare destructors virtual in polymorphic base classes.)
    Effective C++:条款06:若不想使用编译器自动生成的函数,就该明确拒绝 (Explicitly disallow the use of compliergenerated functions you do not want.)
    #define高级教程
    Effective C++:条款04:确定对象被使用前已先被初始化 (Make sure that objects are initialized before they're used.)
    Effective C++:条款05:了解C++默默编写并调用哪些函数 (Know what functions C++ silently writes and calls.)
    Linq 调用存储过程(转)
  • 原文地址:https://www.cnblogs.com/xbzhu/p/6855783.html
Copyright © 2011-2022 走看看