大话TCP/IP协议之HTTP网络协议(一)

Part1.最熟悉的陌生人

和TCP/UDP协议比起来,HTTP协议或许更为大家所熟知,因为大家处处都可以看到http://xxx.com的字样。但是,真

正了解HTTP协议的同学,或许只是少数,还有很多人甚至不知道"404"的含义。而本文,正是让大家来更深入的了解

下这位最熟悉的陌生人。

Part2.HTTP在江湖中的地位

众所周知,Internet四层网络模型(也称TCP/IP四层模型)包括数据链路层、网络层、传输层和应用层。网络层最著名的协议是IP协议,传输层最著名的协议是TCP协议和UDP协议,而应用层的协议众多,诸如FTP协议、TELENT协议、TFTP协议、POP协议、SMTP协议、DNS协议、SNMP协议,当然还包括了本文的主角HTTP协议。如果说TCP/UDP/IP协议算作幕后的英雄,那么毫不夸张的说,HTTP协议则是台前最大腕的明星。

Part3.HTTP大概是怎样工作的

HTTP,是符合Client/Sever模型的,总是Client来发起请求。整个过程,可以简单分为四步:

(1)客户端发起请求,与服务器端完成"TCP三次握手";

(2)客户端向服务器端发出"HTTP请求报文";

(3)服务器端在完成内部处理后,向客户端发出"HTTP响应报文";

(4)客户端与服务器端完成"TCP四次分手"。

而HTTP协议本身是一种无状态的协议,也就是说每一个HTTP报文不依赖于前面的报文状态。

Part4.HTTP的URL如何表示

之所以要先讲一下URL,是因为这个知识点在下文中会频繁用到。

HTTP协议中的URL主要是用于定位服务器端资源的位置。我们来看下它的语法定义:

http://http[:port][path]

其中:

http:// 表示我们使用的协议是HTTP协议;

host 表示一个可用的域名或IP地址;

port 为可选,表示要请求的端口号,缺省情况下为80

path 为可选,表示要请求的资源所在的路径(也叫URI),缺省情况下为 /

Part5.HTTP请求长什么样儿

我们先来看一个典型的HTTP请求报文长什么样子:

(我们用/* */注释嵌到请求里,让大家更好的理解每一行语句的含义)

/* 第一行叫做请求行(request),其它的各行都叫做头部行(header) */

/* 请求行包括三个字段:方法字段、URI字段、HTTP版本字段 */

/*  这个例子的请求行,是要做这样一件事:用HTTP协议1.1版本,使用GET方法,向服务器端

申请/path/to/page.html资源 */

GET /path/to/page.html HTTP/1.1

/* 下面都属于头部行 */

/* Host用来指定要请求的服务器端主机位roclinux.cn */

Host:roclinux.cn

/* Connection:close是要告诉服务器端,我客户端不想使用持久连接,请服务器端在完成这次请求响应后关闭

此连接。虽然这个报文请求中使用了支持持久连接的HTTP1.1版本,但客户端仍然不想使用持久连接 */

Connection:close

/* User-agent域则是用来指定当前这个请求报文是谁产生的,通常来说,一般这里的设置的是用户所使用的浏览器

类型。不要小看这个域,一些用心的站长,会通过这个域来识别客户,并给不同的客户展示资源的不同版本呢! */

User-agent:Mozilla/4.0

/* Accept-language域,则是客户端再跟服务器说"如果你哪里有我申请的资源的中文版本,那就把中文版本给我;

如果没有中文版本,那就把你的默认语言版本给我就好了。" */

Accept-language:zh-cn

/* 看这里,看这里!或许谁也没有注意到这里,这里有一个空行,而且是必须有这个空行。这是HTTP协议的硬性

规定,不要忘记哦 */

下面,用我精心画的一张图,来说明下HTTP协议请求报文的格式:

从上面这个图,应该可以很清晰的看出请求报文的具体格式了。

Part6.HTTP请求报文中有哪些方法

HTTP请求方法有很多,我们走马观花的看看:

GET方法:请求某资源

POST方法:请求某资源的同时附上一些数据

HEAD方法:请求某资源对应的响应报文头

PUT方法:上传一个资源

DELETE方法:删除一个资源

TRACK方法:让服务器回送请求报文,用于调试和排障

OPTIONS:请求服务器性能信息

CONNECT:预留给代理服务器所用

Part7.怎么响应HTTP的请求

在了解完请求报文的格式之后,你是不是想知道HTTP协议是如何响应请求报文的呢,我们来看一个典型的响应报文:

/* 一个响应报文,一般包括三部分,即状态行、头部行、附属体 */

/* 第一行是状态行,包括三个字段:版本字段、状态码字段、原因短语字段 */

/* 本例中,HTTP协议的响应报文想表达的意思是服务器使用的是HTTP协议1.1版本,而且找到了客户端所要

的资源,且会将响应报文发给客户端,整个过程都很正常 */

HTTP/1.1 200 OK

/* 服务器端不会保持住这个连接,而是在回复完这个响应报文之后会断开这个连接 */

Connection:close

/* 这里记录了这个响应报文被发送出去的时间点 */

Date: Thu, 13 Oct 2005 03:17:33 GMT

/* Server域表明这个响应报文是由类Unix操作系统上的Apache服务器发出的,且Apache的版本是2.0.54 */

Server:Apache/2.0.54(Unix)

/* 用于记录本响应报文中所存的数据的最后修改时间 */

Last—Modified:Mon,22 Jun 1998 09;23;24 GMT

/* 指出数据部分的字节数,即单位Byte */

Content-Length:6821

/* 指出所包含的数据是HTML文本内容 */

Content—Type:text/html

/* 看这里,还得看这里,和请求报文类似,这里也有一个空行,不能省哦 */

/* 这里是实际的响应数据 */

(data data data data ......)

下面,我们同样来看看响应报文的协议格式:

Part8.说说HTTP的状态码

说到HTTP响应报文,就不得不提到HTTP状态码。相信大家看完这一小节后,就会很清楚404代表着什么了。

状态码总共只有三位,第一位表示状态类别,共分为五种,我们来依次看一下:

1xx:是进度通知类状态,意思就是说“请求我已经收到了,或你的请求我正在处理”;

2xx:表示“你的请求我已经成功处理了”;

3xx:即重定向,也就是服务器告诉客户端“你要的资源搬家了,你到某某地方再去找他吧”;

4xx:客户端发来的响应报文里有些错误,比如语法错误或请求的资源不存在等;

5xx:服务器端有些问题,已经无法处理完成你的请求了。

其实常用的状态码并不多,我们把常见的列举在此:

200 OK:客户端请求成功了,客户端要的东西就在响应报文里了;

301 Moved Permanently:客户端啊,你要请求的资源已经永久的搬家了,我把他的新地址放到了Location头部域中了;

302 Moved Temporarily:客户端啊,你要请求的资源临时有事去别的地方了,我把他的位置放到了Location头部域中了,你可以先去那里找他,不过他应该是会回到他自己的家的;

304 Not Modified:客户端啊,你要请求的资源自从上次你请求之后,就再也没有改动过,我想你是应该早就有这个资源了,所以在响应报文的数据部分我也没有再放这个资源。

400 Bad Request:客户端发来的请求报文里有语法错误,服务器端实在看不懂了;

401 Unauthorized:客户端发来的请求不是合法来源的请求,也就是这个客户端是没有被授权的;

403 Forbidden:服务器端顺利收到了客户端的请求,但是因为某些理由,服务器端拒绝为他提供服务;

404 Not Found:客户端要请求的资源不存在,八成是资源地址写错了;

500 Internal Server Error:很遗憾,服务器不能给你提供服务了,服务器内部出现了不可预知的问题了;

502 Bad Gateway:客户端你好,我是请求报文的代理服务器,持有资源的那个服务器在给我发送资源时出问题了;

503 Server Unavailable:服务器现在可能是太忙了,暂时不能给你这个客户端提供服务了,或许稍后会恢复。

时间: 2024-10-15 19:12:27

大话TCP/IP协议之HTTP网络协议(一)的相关文章

OSI七层模型,讲解tcp/ip五层涉及的网络协议,网络通信实现,结合协议来看网络通信流程

当我们通过自己电脑的浏览器访问京东的时候, 览器上输入了一个网址,但是我们都知道,互联网连接的电脑互相通信的是电信号,我们的电脑是怎么将我们输入的网址变成了电信号然后发送出去了呢,并且我们发送出去的消息是不是应该让京东的服务器能够知道,我们是在请求它的网站呢,也就是说京东是不是应该知道我发送的消息是什么意思呢.是不是发送的消息应该有一些固定的格式呢?让所有电脑都能识别的消息格式,他就像英语成为世界上所有人通信的统一标准一样,如果把计算机看成分布于世界各地的人,那么连接两台计算机之间的intern

[TCP/IP详解卷1:协议] Chapter2.链路层

链路层三个目的:(TCP/IP支持各种链路层协议:以太网,令牌环网,光纤分布式数据接口.etc) (1)为IP模块收发IP数据包. (2)为ARP模块发送ARP请求和接受ARP应答. (3)为RARP发送RARP请求和接受RARP应答. 以太网 以太网是当今TCP/IP采用的主要局域网技术.使用CSMA/CD媒体接入方法. 802.2定义802网络共有的逻辑链路控制. 802.3针对整个CSMA/CD网络. 802.4针对令牌总线网络. 802.5针对令牌环网络. 原文地址:https://ww

TCP/IP的三次握手协议

关于TCP/IP的三次握手协议,这篇文章中有详细的介绍,很通俗易懂,什么时候忘了,都可以过来瞧两眼,保证很快就明白了. 首先TCP/IP协议分为三个阶段:建立连接(握手阶段),数据传输阶段,连接终止阶段. 看到以前学习的<计算机网络>课本,书上介绍,数据传输阶段的时候,突然想到QQ或者阿里旺旺是不是采用TCP/IP协议进行聊天的, 发现阿里旺旺应该是采用TCP/IP协议,但是QQ是采用UDP协议进行聊天的,采用TCP协议进行保持登录状态的.关于QQ采用的协议,可以参考这篇知乎问答 关于他们具体

关于HTTP协议跟TCP、IP协议到底在网络协议中的分层。

我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯规范,也就是因为双方要进行通讯,大家要事先约定一个规范. 1.连接 当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程,把www.mycompany.com变成ip,如果url里不包含端口号,则会使用该协议的默认端口号.

TCP/IP中的传输层协议TCP、UDP

TCP提供可靠的通信传输,而UDP则常用于让广播和细节控制交给应用的通信传输. 传输层协议根据IP数据报判断最终的接收端应用程序. TCP/IP的众多应用协议大多以客户端/服务端的形式运行.客户端是请求的发起端,而服务端表示提供服务的意思,是请求的处理端.因此,作为服务端的程序有必要提前启动,准备接收客户端的请求.传输协议根据接收数据中的目标端口号识别目标处理程序. TCP.UDP比较 TCP提供可靠性传输.实行顺序控制或重发控制机制,还有流量控制和拥塞控制,提高网络利用率. UDP是不具备可靠

《TCP/IP详解 卷1:协议》读书笔记

第一章 概述 协议栈 应用层 HTTP,FTP   运输层 TCP, UDP 段(Segment) 网络层 IP, ICMP, IGMP 数据报(Datagram) 链路层   帧(Frame) 物理层     应用层关心的是应用程序的细节,而不是数据在网络中的传输活动:下面四层对应用程序一无所知,但它们要处理所有的通信细节. 互联网地址 端口号 周知端口号(Well-Known Ports) 1-255 Unix系统占用端口 256-1023 临时可分配端口 1024-5000 为其他服务预留

设置Windows的TCP/IP属性和内部网络号码

这里,以Windows XP和Windows 7版本为例. 在安装了IPX/SPX协议或TCP/IP协议的Windows计算机上可以设置计算机的内部网络号码,主要可以防止进行局域网连接时出现冲突现象. 说明:在Windows 7.8.10中,是已经没有了IPX/SPX协议了. 步骤一:选择"属性" 步骤二:选择"本地连接",再"属性" 步骤三:选择"Internet 协议(TCP/IP)",再"属性".若是

&lt;再看TCP/IP第一卷&gt;关于网络层及协议细节---IP协议

说到关于IP协议,就必须先说IP协议的两个特性: (一)不可靠性(unreliable) 不可靠性的意思是它不能保证IP数据报能成功地到达目的地,IP所能做的只是提供最好的传输服务,IP有一个简单的错误处理算法:丢弃该数据,然后发送ICMP消息报给信源端,任何的可靠性就必须由上一层的协议来提供. (二)无连接性(connectionless) 无连接性的意思是IP并不维护任何关于后续的数据报(datagram)的状态信息,数据报之间是平行的互不干涉,IP不维护后续的状态信息. IP数据报的格式如

&lt;再看TCP/IP第一卷&gt;关于网络层及协议细节---IP协议(2)--移动IP及DHCP

题外话:本来想按照互联网的层级自下向上回顾这些协议的,但是今天实在得破个例,DHCP不得不说! 主机从一个网络迁移到另一个网络,那么IP编址的结构就要发生改变,当今主流有如下几种修改方案: (一)改变地址: 主机在移动到新的网络的时候改变它的地址,这里需要DHCP协议,将其和新的网络关联起来,这么做的话需要我们手动修改可能需要如下的命令 1 sudo vim /etc/network/interface 每次修改若想要使修改之后生成的IP地址生效,大部分情况下需要我们重启主机 1 /etc/in