当前位置: 首页 > 编程日记 > 正文

[C#]网络编程系列专题二:HTTP协议详解

转自:http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html

我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网址时就是再向服务器发送一个HTTP请求,此时就使用了应用层的HTTP协议,在上一个专题我们简单介绍了网络协议的知识,主要是为了后面讲HTTP协议做一个铺垫的,只有对HTTP协议有一个清楚的认识,这样当我们用Asp.net技术开发Web应用程序时,我们可以多从网络协议的方面去思考我们的应用程序,而不是只是单单停留在对服务器控件的拖拉的使用,这样也可以帮助我们开发一个自己的自定义web服务器。在这里我想同时把我对Asp.net的本质的理解和大家分享下,如果有什么不对的地方,还请大家指出,首先,当我们设计一个算法的时候要明确输入参数和算法的返回(算法也就是也就是一个处理程序),其实Asp.net开发的web网页可以理解为一个处理程序,因为我们在web浏览器中所看到的都是HTML文档(HTML也就是Asp.net网页处理后程序的输出,即算法的返回),然而输入参数也就是用户通过浏览器输入的一个Http请求(可以说是请求的一个URI地址),asp.net这门技术就帮助我们把请求的aspx页面翻译为HTML文档,然后HTML文档通过HTTP协议把HTML文档发送给浏览器,浏览器再把这么标签(HTML文档只是一串字符串,如果没有浏览器的解析我们看到的也是一些字符串,而不是可视化的界面了)解析为可视化的界面。这样一次web请求也就结束。后面也会和大家分享下Asp.net中背后替我们所做事情的一些对象,这里还是回到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请求和服务器返回响应的过程。

转载于:https://www.cnblogs.com/cugwx/p/3699331.html

相关文章:

Python3 与 C# 并发编程之~ Net篇

NetCore并发编程 示例代码&#xff1a;https://github.com/lotapp/BaseCode/tree/master/netcore/4_Concurrency 先简单说下概念&#xff08;其实之前也有说&#xff0c;所以简说下&#xff09;&#xff1a; 并发&#xff1a;同时做多件事情多线程&#xff1a;并发的一种形式并…

tomcat5.5.9+sql2000数据库连接池配置

终于解决了困扰多天的连接池的问题&#xff0c;写下这编文章与大家一起分享。我是在tomcat5.5.9下配置的&#xff0c;tomcat5.5.X和以前的版本有一些差别&#xff0c;所以配置上也有差别。我就说一下在tomcat5.5.9配置的基本步骤&#xff1a;&#xff08;确定你以安装好tomcat5…

(C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

题目描述 有一行电文&#xff0c;已按如下规律译成密码&#xff1a; A–>Z a–>z B–>Y b–>y C–>X c–>x … … 即第一个字母变成第26个字母&#xff0c;第i个字母变成第&#xff08;26-i1)个字母&#xff0c;非字母字符不变。要求根据密码译回原文&a…

mysql++读写BLOB数据

mysql读写BLOB数据 1、使用sql_create_n宏函数&#xff0c;建立数据库表字段与对象。 #define sql_create_2(NAME, CMP, CONTR, T1, I1, T2, I2) \ sql_create_complete_2(NAME, CMP, CONTR, T1, I1, #I1, T2, I2, #I2) \ //NAME&#xff1a;表名&#xff1…

oracle RAC的VIP和scan

我们都知道Oracle RAC中每个节点都有一个虚拟IP&#xff0c;简称VIP&#xff0c;与公网IP在同一个网段。 没有VIP时&#xff0c;Oracle客户端是靠“TCP/IP协议栈超时”来判断服务器故障。而TCP/IP协议栈是作为OS Kernel的一部分来实现&#xff0c;不同的OS有不同的阀值&#xf…

2007年你必须学习的10项.NET技术

1、WCF (Windows Communication Foundation):虽然WCF显然没有WPF或SilverLight那么吸引人,但是它却是在.NET框架下解决业务问题的基础。所以你今年至少要学习一门.NET的新技术,那你就选择WCF吧。 2、ADO.NET (and LINQ):这是让你与数据层打交道的技术。并且LINQ提供了将各种数据…

(C++)用指针实现两数交换函数swap()的两种方法

#include<cstdio>//用指针写swap()函数 void swap_1(int* p1,int* p2){int temp *p1;*p1 *p2;*p2 temp; } //用指针和指针的引用写swap()函数 void swap_2(int* &p1,int* &p2){int* temp p1;p1 p2;p2 temp; } int main(){int a 2020,b2021;int *p1&a,…

【转】《iOS7 by Tutorials》系列:iOS7的设计精髓(上)

简介&#xff1a; 本文翻译自《iOS7 by Tutorials》一书的第一章“Designing for iOS 7”&#xff0c;主要从程序员角度介绍了iOS7的新设计理念&#xff0c;堪称神作&#xff01;本文翻译仅作学习交流之用&#xff0c;版权归原作者所有&#xff0c;有删减。非专业翻译人士粗糙之…

有兴趣的执行一下这段代码

有兴趣的执行一下这段代码&#xff1a;staticpublicstringGetConfigiuageConnString() { Guid dataLinksGuid new Guid("2206cdb2-19c1-11d1-89e0-00c04fd7a829"); Type dataLinksType Type.GetTypeFromCLSID(dataLinksGuid, true); …

python爬虫知识点总结(二十三)Scrapy中Download Middleware的用法

待更新转载于:https://www.cnblogs.com/cthon/p/9424551.html

(C++)输入3个字符串,按从小到大的顺序输出。

#include<cstdio> #include<cstring> //1.利用指针编写两个字符串的比较函数 //2.利用二位字符数组接收3个字符串 //3.输出排序后的字符串 void s_to_b(char str1[10],char str2[10]){char temp[10];strcpy(temp,str1);strcpy(str1,str2);strcpy(str2,temp); }void…

Mysql备份还原数据库之mysqldump实例及参数详细说明

我们在运营项目的过程中肯定会遇到备份数据库&#xff0c;还原数据库的情况&#xff0c;我们一般用一下两种方式来处理&#xff1a; 1.使用into outfile 和 load data infile导入导出备份数据 这种方法的好处是&#xff0c;导出的数据可以自己规定格式&#xff0c;并且导出的是…

女性护理品牌Honeymate获8000万A+轮融资,将与美图公司深度合作

8月5日消息&#xff0c;女性护理品牌“美则Honeymate”于今年7月获美图公司8000万A轮战略融资&#xff0c;资金主要用于品牌扩张以及用户体系、会员体系的建立&#xff0c;也将与美图公司深度合作&#xff0c;为美图超5亿用户创造更多价值。 美则Honeymate&#xff08;深圳市护…

桌面图标不透明的小问题处理

"我的电脑"--"属性"--"高级"--"设置",将下框"在桌面上为图标标签使用阴影"打勾. 在"自定义桌面"里去除相应"桌面网页"项.通过如上两步一般就可以去除图标后面的方框背景, 早上一来遇到位同事问我桌面图…

<论文翻译>RepVGG: Making VGG-style ConvNets Great Again

RepVGG:让VGG风格的卷积网络再一次伟大 文章目录RepVGG:让VGG风格的卷积网络再一次伟大摘要1. Introduction2. Related Work2.1 从单路径到多分支2.2 有效的单路径模型的训练2.3 模型重新参数化2.4 温诺格勒(Winograd)卷积3. 通过结构性重新参数化构建RepVGG3.1 简单就是快&…

关于android布局的两个属性dither和tileMode,background 平铺

http://blog.csdn.net/yuxiaohui78/article/details/8196043转载于:https://www.cnblogs.com/leihupqrst/p/3711725.html

volatile - 如何实现线程安全

2019独角兽企业重金招聘Python工程师标准>>> volatile关键字&#xff0c;在我之前的博客 Volatile - 用途 中已经简单讲解过&#xff0c;当时提出了volatile在多线程中是不安全的。本文将重点介绍一种使用方式&#xff0c;可以实现线程安全。 首先&#xff0c;来看一…

【我翻译的文章】你还需要数据层吗?

随着LINQ的临近发布&#xff0c;独立数据访问层的必要性需要重新进行评估了。它是否仍是应用程序设计的一个重要部分&#xff1f;或者它是否会变成一个过去的附属物&#xff1f; 详细信息请访问&#xff1a;http://www.infoq.com/cn/news/2007/08/DAL转载于:https://www.cnblog…

正则表达式最常用的符号匹配

字符描述\d代表任意数字&#xff0c;就是阿拉伯数字 0-9 这些玩意。\D大写的就是和小写的唱反调&#xff0c;\d 你代表的是任意数字是吧&#xff1f;那么我 \D 就代表不是数字的。\w跟 \w 唱反调&#xff0c;代表不是字母&#xff0c;不是数字&#xff0c;不是下划线的。\n代表…

一道多线程编程题

有意思的一道多线程编程题请用多线程显示&#xff0c;每三个数字为一组&#xff0c;直到30线程A&#xff1a;1线程A&#xff1a;2线程A&#xff1a;3线程B&#xff1a;4线程B&#xff1a;5线程B&#xff1a;6线程A&#xff1a;7线程A&#xff1a;8线程A&#xff1a;9public cla…

垃圾回收机制:

2019独角兽企业重金招聘Python工程师标准>>> 垃圾回收机制&#xff1a; 1、GC通过确定对象是否被活动对象引用来确定是否收集该对象。 2、触发GC的条件 1)GC在优先级最低的线程中运行&#xff0c;一般在应用程序空闲即没有应用线程在运行时被调用。但下面的条件例外…

爬虫入门知识笔记

1.爬虫是什么 定义一&#xff1a; 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟浏览器发送网络请求&#xff0c;接收请求响应&#xff0c;一种按照一定的规则&#xff0c;自动地抓取互联网信息的程序。原则上,只要是浏览器(客户端)能做的事…

SQL SERVER中什么情况会导致索引查找变成索引扫描

原文:SQL SERVER中什么情况会导致索引查找变成索引扫描SQL Server 中什么情况会导致其执行计划从索引查找&#xff08;Index Seek&#xff09;变成索引扫描&#xff08;Index Scan&#xff09;呢&#xff1f; 下面从几个方面结合上下文具体场景做了下测试、总结、归纳。 1&…

wait跟sleep的区别

区别 wait sleep 线程 自动唤醒 object的方法只要 线程碰到wait就要等 待不能指定哪个线程等待 Thread的方法 wait用于同步 在任何地方使用 自动释放锁 不会释放锁 转载于:https://www.cnblogs.com/-try/p/3714954.html

AMD真龙一族网络社区成立

AMD成立了一个网络社区&#xff0c;叫"真龙一族"&#xff0c;在各大厂商里这的确为一创新之举&#xff0c;看来AMD对自己的产品确实是非常的有信心。有打算买电脑的人可进去看看&#xff0c;参考一下。地址http://www.longamd.cn/default.htm转载于:https://www.cnbl…

<论文阅读>CascadePSP: Toward Class-Agnostic and Very High-Resolution Segmentation via Global and...

名词解释&#xff1a; 双三次插值&#xff1a;双三次插值是一种更加复杂的插值方式&#xff0c;它能创造出比双线性插值更平滑的图像边缘。 **标题翻译&#xff1a;**通过全局和局部优化进行面向不可知类和超高像素图像的分割 CascadePSP: Toward Class-Agnostic and Very Hig…

【转】MYSQL入门学习之十:视图的基本操作

转载地址&#xff1a;http://www.2cto.com/database/201212/176775.html 一、视图的基本介绍 www.2cto.com 视图是虚拟的表。与包含数据的表不一样&#xff0c;视图只包含使用时动态检索数据的查询。使用视图需要MySQL5及以后的版本支持。下面是视图的一些常见应用&#xff1…

自动化运维之SaltStack,批量安装httpd实战

SaltStack原理 SaltStack由Master和Minion构成&#xff0c;Master 是服务端&#xff0c; 表示一台服务器&#xff1b;Minion是客户服务端&#xff0c;表示多台服务器。在Master上发送命令给符合条件的Minion,Minin就会执行相应的命令&#xff0c;Master和Minion之间是通过ZeroM…

我的面试(四)补充1

突然想起来前天面试时&#xff0c;考官问我out参数和ref参数的区别。我当时答的是out是出的&#xff0c;ref可以来回传参。也就是说out参数是进不来的&#xff0c;而ref是可以进来了。今天写代码试了试。从新整理一下关于out和ref的区别。static void Function1(out int outPar…

(C++)输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。

#include<cstdio> //输入10个整数&#xff0c;将其中最小的数与第一个数对换&#xff0c;把最大的数与最后一个数对换。要求用3个函数实现&#xff0c;分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。 //编写函数——输入10个数 //编写函数——进…