【计算机网络】应用层协议--HTTP协议及HTTP报文格式

目录

1、HTTP是什么

2、HTTP请求与响应

3、HTTP请求的两种方法(get和post)及区别 (面试题)

4、几种常见的错误的说法

5、HTTP协议的特点

6、应用场景

7、HTTP报文格式

8、面试题:HTTP常见的状态码都有哪些?


1、HTTP是什么

HTTP协议是在Web上进行数据交换的基础,是一种“客户端-服务器端”(B/S 架构)协议。作用于应用层。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

HTTP 是一个简单的请求/响应协议,通常运行在 TCP(Transmission Control Protocol 的简称,是一种面向连接的、可靠的、基于字节流的传输层通信协议)之上。HTTP 协议指定了客户端能够发送什么样的消息给服务端,以及服务端要做出怎样的响应。服务器会默认监听 TCP 协议的 80 端口,当然后期您也可以修改为其它端口。

HTTP 协议为计算机之间的通信提供了一种标准和规范,它规定了:

  • 如何构造客户端的请求数据(也称报文);
  • 如何将请求数据发送到服务器;
  • 服务器端如何响应客户端的请求。

2、HTTP请求与响应

客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。

  • 由像浏览器这样的客户端发出的消息叫做请求( requests )
  • 被服务端回应的消息叫做响应( responses)

3、HTTP请求的所有方法:

  • HTTP1.0 : 三种:post,get,head
  • HTTP1.1:  八种:post,get,head,options,put,delete,trance,connect

4、HTTP请求的两种方法(get和post)及区别 (面试题)

区别:其实本质上没有太大区别,但非要说个区别,如下:

  1. get请求一般用来请求获取数据,post请求一般作为发送数据到后台,传递数据,创建数据。例如登录,上传等。
  2. get请求也可以传参到后台,但是传递的参数则显示在地址栏,安全性低,且参数的长度也有限制(2048字符),post请求则是将传递的参数放在request body中,不会在地址栏显示,安全性比get请求高,参数没有长度限制
  3. get请求刷新浏览器或者回退没有影响,post请求则会重新请求一遍
  4. get请求可以被缓存,也会保留在浏览器的历史记录中,post请求不会被缓存,也不好保留在浏览器的历史记录中
  5. get请求通常是通过url地址请求,post常见的则是form表单请求
  6. get产生一个tcp数据包,post产生两个tcp数据包
  7. get产生的URL地址可以被Bookmark,而post不可以
  8. get请求会被浏览器主动cache(缓存),而post不会,除非手动设置
  9. 对参数的数据类型,get只接受ASCII字符,而post没有限制。
  10. get比post更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  11. GET 和 POST都是http请求方式, 底层都是 TCP/IP协议;通常GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包(但firefox是发送一个数据包),
  12. 对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据)表示成功;而对于 POST,浏览器先发送 header,服务器响应 100, 浏览器再继续发送 data,服务器响应 200 (返回数据)。

5、几种常见的错误的说法

1.get请求能传递的数据量有限,post传递的数据量没有上限。

  • 但是标准文档中并没有明确规定URL有多长。

2.get请求数据不安全,post请求数据更安全。

  • 依据是:若使用get实现登录操作,用户名和密码会暴露在URL中,也就是地址栏里。人们可以看到。而使用post操作则是把用户名和密码放在body中,不会在地址栏里显示。
  • 但其实这种说法也是有问题的,所谓的安全是是指不容易被黑客获取,或者是获取之后不容易被破解。

3.get只能给服务器传输文本数据,post可以给服务器传输文本和二进制数据。

  • get也是可以传输二进制数据的。

4.get请求是幂等的,post请求不是幂等的。

  • 这里的幂等指的是输入相同的内容,输出是稳定的。这种说不也不完全对。

6、HTTP协议的特点

1) 简单快速

  • HTTP 协议支持客户端、服务器端模式,简单快速,当客户端向服务器端发送请求时,只需要传送请求方法和路径即可,常用的请求方法有 GET、HEAD、POST 等,每种方法都定义了客户端与服务器之间不同的信息交换方式。

2) 灵活

  • HTTP 允许传输任意类型的数据对象,包括音频、视频、图片、文本等等。

3) 无连接

  • HTTP 是无连接的,当服务器接受到来自客户端的请求后,会按顺序依次处理这些请求,处理完成一个就关闭一个,然后开始处理下一个请求。无连接的含义是限制每次连接只处理一个请求。服务器处理完客户端的请求,并收到客户端的应答后,随即断开连接,采用这种方式可以节省传输时间。

4) 无状态

  • HTTP 协议是无状态协议,无状态是指协议对于信息的处理没有记忆能力。也就是说来自同一个客户端的多个请求之间没有上下文关系,每次的请求都是独立的,一次请求的执行情况和结果与它前面的请求或后面的请求没有直接关系。
  • 服务器中并不会保存客户端的状态,也就意味着如果后续处理中需要用到前面的信息,那么您就需要将它重新发送到服务端,这样可能会导致每次连接传送的数据量增大。但从另一方面来讲,如果服务器不需要先前信息时它的响应就会比较快。
     

7、应用场景

(1)网页和后台服务器的交互。

(2)app和后台服务器的交互。


8、HTTP报文格式

HTTP报文,又称为HTTP消息,是服务器和客户端之间交换数据的方式。有两种类型的消息︰请求,由客户端发送用来触发一个服务器上的动作;响应,来自服务器的应答。

8.1 请求

请求报文由以下元素组成:一个HTTP的method、要获取的资源的路径、HTTP协议版本号、为服务端表达其他信息的可选头部headers以及对于一些像POST这样的方法。具体格式如下:

  1. 首行:方法 URL 版本号
  2. 请求头(header)键值对形式
  3. 空行
  4. 正文(body)

 接下来主要说说请求里的响应header。 

  • Host  : 表示服务器主机的地址和端口。
  • Content-Length : 表示body中的数据长度,前提是请求里有body。
  • Content-Type:表示请求的body中的数据格式,前提是请求里有body。
  • User-Agent:描述了使用啥设备上网(操作系统版本及浏览器版本),可以去区分是PC端还是手机端。
  • Referer:表示当前页面是从那个页面跳转过来的。
  • cookie:由于HTTP是无状态的。没有记忆的。但在某些场景中,我们希望有些数据可以被重复使用,比如登录操作的用户名和密码。于是产生了一种会话技术,存储一些信息到浏览器中。它由服务器产生,响应中携带cookie,并且要求保存在客户端(通常指浏览器)。
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问
  • ...............

通常情况下,get请求没有body,post请求有body。


为什么要有空行和Content-Length?

目的是为了解决粘包问题。因为HTTP也是基于TCP的,TCP是以字节为单位传输的,传过去之后,接收方数据包都紧挨在一起,接收方也识别不出哪到哪是body,这样就需要用空行来区分body,再用content-Length来区分body中数据的长度。
 


8.2 响应

响应报文由以下元素组成:HTTP协议版本号、一个状态码、一个状态信息、HTTPheaders以及包含获取的资原body。

  1. 首行:版本号 状态码  状态码信息
  2. 响应头(header)键值对形式
  3. 空行
  4. 正文(body)


Content-Type的作用:

返回此次响应的数据格式。

构造请求(get,post)有json,form表单的格式,from-data的格式,ajax也能构造get和post请求。

响应有html,css,js,json,图片,text等数据格式。


9、面试题:HTTP常见的状态码都有哪些?

状态码:服务器的响应,表示了这次请求对应的响应是啥样的状态。

  • 2开头的表示成功,其中200最常见。
  • 3开头的表示重定向,比如我访问某个网址,他就会让我访问另一个网址,并在响应报文中携带这个新的网址。301是永久重定向,302是临时重定向。
  • 4开头的是请求有误,比如网址输入错误等,其中404表示访问资源在服务器上不存在。403表示访问没有权限,禁止访问。
  • 5开头的是服务器出错。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
计算机网络》课程设计 题 目 数据包发送和接受程序的实现 学 院 计算机学院 2012年12月21日 数据包发送和接受程序的实现 一、设计题目与要求 1.设计题目 发送TCP数据包 2.设计要求 本设计的功能是填充一个TCP数据包,并发送给目的主机。 1)以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号 ,dest_ip为目的地址,dest_port为目的端口号。 2)其他的TCP头部参数请自行设定。 3)数据字段为"This is my homework of network,I am happy!"。 4)成功发送后在屏幕上输出"send OK"。 三、详细设计 本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整 个程序由初始化原始套接字和发送TCP数据包两个部分组成。 当应用进程需要通过TCP发送时,它就将此应用传送给执行TCP协议的传输实体 。TCP传输实体将用户数据加上TCP头,形成TCP数据包,在TCP数据包上增加IP头部, 形成IP包。如图- 1显示的是TCP数据包和IP包得关系。TCP协议的数据传输单位称为段,其格式如图- 2所示。头的长度是20B~60B,选项部分长度最多为40B。TCP段主要包括以下 字段。 端口号:端口号字段包括源端口号和目的端口号。每个端口号的长度是16位,分别表 示发送该TCP包的应用进程的端口号和接收该TCP包的应用进程的端口号。 图-1 TCP数据包加上IP头形成IP包 序号:长度为32位。由于TCP协议是面向数据流的,它所传送的段可以视为连续 的数据流,因此需要给每一字节编号。序号字段的"序号"指的是本段数据的第一个 字节的序号。 确认号:该字段的长度为32位,它表示接收端希望接收下一个TCP包的第一个字节的 序号。 长度:该字段长度为4位。TCP长度是以4B为一个单元来计算的,实际上 长度在20B~60B之间。因此这个字段的值在5~15之间。 图-2 TCP数据包头部的格式 保留:长度为6位,留做今后使用,目前全部置0. 控制:这个字段定义了6种不同的标志,每一个标志占一位,在同一时间可以设置一 位或多位。URG位为1时,表明应尽快把数据传送给应用程序,否则表明允许数据在缓存 中存放一段时间。RST位为1时,表明要强制切断连接。SYN位为1时,表明有确立连接的 请求,这时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN位为1时,表 明发送放已经没有数据发送了。 窗口大小:长度为16位,指向必须紧急处理的数据的位置,因此最多能够传送的数据 为65535B。 紧急指针:该字段长度为16,指向必需紧急处理的位置,只有当标志URG=1时紧急指 针才生效。从TCP头后面的数据开始,到紧急指针所指出长度的数据,就是必须紧 急处理的数据。 选项: 该字段可以多达40B,包括单字节选项和多字节选项。 校验和:该字段长度为16位,校验和的校验范围包括伪头部,TCP头以及应用层来 的数据。其计算方法与IP协议头部校验和的计算方法一样。伪头部为12B,它本身并不是 TCP数据包的真头部,只是在计算校验和时,临时和TCP数据包连接在一起。伪头部的格 式如图-3所示 0 8 16 24 31 "源IP地址 " "目的IP地址 " "00000000 "协议号(6) "TCP长度 " 创建一个原始套接字,并设置IP头选项 SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); 这里,设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。 为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计 中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作选项。 其中flag设置为ture,并设定 IP_HDRINCL 选项,表明自己来构造IP头。 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&Flag, sizeof(Flag)); int timeout=1000; setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout)); 在这里我们
目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 分层 1 1.3 TCP/IP的分层 4 1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行线路吞吐量计算 21 2.11 小结 22 第3章 IP:网际协议 24 3.1 引言 24 3.2 IP首部 24 3.3 IP路由选择 27 3.4 子网寻址 30 3.5 子网掩码 32 3.6 特殊情况的IP地址 33 3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的分组格式 40 4.5 ARP举例 41 4.5.1 一般的例子 41 4.5.2 对不存在主机的ARP请求 42 4.5.3 ARP高速缓存超时设置 43 4.6 ARP代理 43 4.7 免费ARP 45 4.8 arp命令 45 4.9 小结 46 第5章 RARP:逆地址解析协议 47 5.1 引言 47 5.2 RARP的分组格式 47 5.3 RARP举例 47 5.4 RARP服务器的设计 48 5.4.1 作为用户进程的RARP服务器 49 5.4.2 每个网络有多个RARP服务器 49 5.5 小结 49 第6章 ICMP:Internet控制协议 50 6.1 引言 50 6.2 ICMP的类型 50 6.3 ICMP地址掩码请求与应答 52 6.4 ICMP时间戳请求与应答 53 6.4.1 举例 54 6.4.2 另一种方法 55 6.5 ICMP端口不可达差错 56 6.6 ICMP的4.4BSD处理 59 6.7 小结 60 第7章 Ping程序 61 7.1 引言 61 7.2 Ping程序 61 7.2.1 LAN输出 62 7.2.2 WAN输出 63 7.2.3 线路SLIP链接 64 7.2.4 拨号SLIP链路 65 7.3 IP记录路由选项 65 7.3.1 通常的例子 66 7.3.2 异常的输出 68 7.4 IP时间戳选项 69 7.5 小结 70 第8章 Traceroute程序 71 8.1 引言 71 8.2 Traceroute 程序的操作 71 8.3 局域网输出 72 8.4 广域网输出 75 8.5 IP源站选路选项 76 8.5.1 宽松的源站选路的traceroute 程序示例 78 8.5.2 严格的源站选路的traceroute 程序示例 79 8.5.3 宽松的源站选路traceroute程序 的往返路由 80 8.6 小结 81 第9章 IP选路 83 9.1 引言 83 9.2 选路的原理 84 9.2.1 简单路由表 84 9.2.2 初始化路由表 86 9.2.3 较复杂的路由表 87 9.2.4 没有到达目的地的路由 87 9.3 ICMP主机与网络不可达差错 88 9.4 转发或不转发 89 9.5 ICMP重定向差错 89 9.5.1 一个例子 90 9.5.2 更多的细节 91 9.6 ICMP路由器发现 92 9.6.1 路由器操作 93 9.6.2 主机操作 93 9.6.3 实现 93 9.7 小结 94 第10章 动态选路协议 95 10.1 引言 95 10.2

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

去北极避暑~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值