1.网络模型
1.1OSI七层模型
- 物理层:
- 为上层协议提供了一个传输数据的可靠的物理媒体。简单的说,物理层确保原始的数据可在各种物理媒体上传输。两个重要的设备名称:中继器、集线器
- 数据链路层:
- 互连设备之间传送和识别数据帧,该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等;基本数据单位为帧;主要协议:ARP协议(地址解析协议)、RARP协议(逆地址解析协议);两个重要的设备名称:网桥和交换机。
- 网络层
- 网络层负责对子网间的数据包进行路由选择,还可以实现拥赛控制、网际互联等功能;数据单位为IP数据报;包含的协议:IP协议(因特网互联协议)、ICPM协议(因特网控制报文协议);重要的设备:路由器。
- 传输层
- 管理两个节点之间的数据传输,负责将上层数据分段、确保数据被可靠的传送到目标地址;包含的协议:TCP协议(传输控制协议)、UDP协议(用户数据报协议);重要设备:网关
- 会话层
- 负责建立和断开通信连接(数据流动的逻辑通路),以及数据的分割等数据传输相关的管理。
- 表示层
- 将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。数据的表示、安全、压缩。
- 应用层
- 应用层为操作系统或网络应用程序提供访问网络服务的接口。数据传输的基本单位为报文。包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议)、POP3(邮局协议)、HTTP协议
1.2TCP/IP四层模型
TCP/IP四层模型:链路层、网络层、传输层、应用层
通讯协议是一种数据交互的规范,收发数据的双方定好数据的编解码的一个规则,然后进行网络传输。
- 网络接口层
- 互连设备之间传送和识别数据帧,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
- 作用:计算机所有的数据本质上都是0和1,那在传输的过程中也是通过光缆这种介质传输的,那数据链路层其实解决的就是物理层面的一个寻址的问题。
- 网络层
- 作用:那网络层的话其实就是对物理地址的进一步抽象和聚合,因为每个计算机都有自己的物理mac地址,如果说每台机器都需要根据mac地址去判断网络上的数据是不是自己的,这样效率其实非常低,所以还是需要网络层进行一次聚合处理,提高数据的传输效率,
- 传输层
- 负责向两台主机中进程之间的通信提供数据传输服务。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
- 作用:传输层的话其实作用是定位到具体的端口号,进行不同主机的进程间的通信,相当于之前的话是送快递,你可以定位到小区,但是传输层的话还要定位你具体的地址是在几层几单元。
- 应用层
- 应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
1.3为什么要进行网络分层?
- 最主要的一个职责要进行一个职责解耦,就是说底层的细节要对上层屏蔽,这样上层的话可以不用感知到底层的细节和变化,还可以根据下层提供的功能再进行进一步的功能叠加
1.4七层通信
发送方由第七层到第一层 由上到下按照顺序传送数据,每个分层在处理上层传递的数据时,附上当前层协议所必须的 "首部"信息。接收方由第一层到第七层 由下到上按照顺序传递数据,每个分层对接收到的数据进行 "首部"与"内容"分离,再转发给上一层。最终将发送的数据恢复为原始数据。
1.5报文、帧、数据包等的区别
报文(message)是网络中交换与传输的数据单元,也是网络传输的单元。报文包含了将要发送的完整的数据信息,其长短不需一致。报文在传输过程中会不断地封装成分组、包、帧来传输,封装的方式就是添加一些控制信息组成的首部,那些就是报文头。
应用层:报文(message),一般指完整的信息,传输层实现报文交付,位于应用层的信息分组称为报文;
传输层:报文段(segment),组成报文的每个分组;
网络层:分组(packet)是网络传输中的二进制格式单元,数据包(datapacket)是TCP/IP通信协议传输中的数据单位;通过网络传输的数据基本单元,包含一个报头和数据本身,其中报头描述了数据的目的地及其与其他数据之间的关系,可以理解为数据传输的分组,我们将通过网络传输的基本数据单元称为数据报(Datagram);
链路层:帧(frame),数据链路层的协议数据单元,为了保证数据的可靠传输,把用户数据封装成帧;
物理层:PDU(bit),协议数据单元; 抓包,抓到的是传输层的包,packet/frame/Datagram/segment是存在于同条记录中的,这些是基于所在协议层的不同取了不同的名字。
2.TCP协议
2.1 TCP (Transmission Control Protocol) 传输控制协议
2.2 TCP协议特点
- TCP是面向连接的传输层的协议(物理层-数据链路层-网络层-传输层-会话层-应用层)。也就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。数据传输完毕以后,必须释放已经建立的TCP的连接
- 每一条TCP连接必须是(一对一)的
- TCP提供可靠交付的服务。通过TCP连接传输的数据,不丢失、不重复、无差错,并且按需到达。
- TCP提供全双工通信。TCP允许通信双方的应用程序在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据存入缓存,上层的应用程序在合适的时候读取缓存中的数据。
- 面向字节流。TCP中“流(Stream)”指的是流入到进程或从进程流出的字节序列。面向字节流的含义是:虽然应用程序和TCP的交互式一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流
2.3 TCP报文
2.3.1数据包
IP 数据包在以太网数据包的负载里面,TCP数据包在IP数据包的负载里。
2.3.2TCP 首部各字段的意义和作用
- TCP首部:最小为20字节,这20字节分为5行,每行4个字节也就是32个位。
- 源端口和目的端口 Port
- 源端口号:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是标识报文的返回地址。
- 目的端口号:16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。计算机通过端口号识别访问哪个服务,比如http服务或ftp服务,发送方端口号是进行随机端口,目标端口号决定了接收方哪个程序来接收 分别占用16位,也就是端口号最大是2^16,所以端口号的范围是0~65536
- 端口号的分配:
- 知名端口号一般位于:1 --- 255 之间
- 256 --- 1023的端口号,通常是由Unix系统占用(系统占用)
- 1024 ---5000 是大多数TCP、IP实现的临时分配
- 大于5000的一般是给其他服务预留的(Internet上并不常用的服务)
- 序号 Sequence Number
- TCP用序列号对数据包进行标记,以便在到达目的地后重新重装,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在建立连接时通常由计算机生成一个随机数作为序列号的初始值。
- 确认号 Acknowledgemt Number
- 占 4 个字节,表示期望收到对方下一个报文段的序号值。 TCP 的可靠性,是建立在「每一个数据报文都需要确认收到」的基础之上的。就是说,通讯的任何一方在收到对方的一个报文之后,都要发送一个相对应的「确认报文」,来表达确认收到。 那么,确认报文,就会包含确认号。 例如,通讯的一方收到了第一个 25kb 的报文,该报文的 序号值=0,那么就需要回复一个确认报文,其中的确认号 = 25600.
- 数据偏移 Offset
- 占 0.5 个字节 (4 位)。 这个字段实际上是指出了 TCP 报文段的首部长度 ,它指出了 TCP报文段的数据起始处 距离 TCP报文的起始处 有多远。(注意 数据起始处 和 报文起始处 的意思)
- 一个数据偏移量 = 4 byte,由于 4 位二进制数能表示的最大十进制数字是 15,因此数据偏移的最大值是 60 byte,这也侧面限制了 TCP 首部的最大长度。
- 保留 Reserved
- 占 0.75 个字节 (6 位)。 保留为今后使用,但目前应置为 0。
- 标志位 TCP Flags
- 标志位,一共有 6 个,分别占 1 位,共 6 位 。 每一位的值只有 0 和 1,分别表达不同意思。
- 确认 ACK (Acknowlegemt)
- 当 ACK = 1 的时候,确认号(Acknowledgemt Number)有效。 一般称携带 ACK 标志的 TCP 报文段为「确认报文段」。为0表示数据段不包含确认信息,确认号被忽略。
- TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 设置为 1。
- 推送 PSH (Push)
- 当 PSH = 1 的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个 TCP 缓存都填满了后再交付。
- 复位 RST (Reset)
- 当 RST = 1 的时候,表示 TCP 连接中出现严重错误,需要释放并重新建立连接。 一般称携带 RST 标志的 TCP 报文段为「复位报文段」。
- 同步 SYN (SYNchronization)
- 当 SYN = 1 的时候,表明这是一个请求连接报文段。 一般称携带 SYN 标志的 TCP 报文段为「同步报文段」。 在 TCP 三次握手中的第一个报文就是同步报文段,在连接建立时用来同步序号。
- 对方若同意建立连接,则应在响应的报文段中使 SYN = 1 和 ACK = 1。
- 终止 FIN (Finis)
- 当 FIN = 1 时,表示此报文段的发送方的数据已经发送完毕,并要求释放 TCP 连接。
- 一般称携带 FIN 的报文段为「结束报文段」。
- 在 TCP 四次挥手释放连接的时候,就会用到该标志。
- 窗口大小 WindowSize
- 占 2 字节。
- 该字段明确指出了现在允许对方发送的数据量,它告诉对方本端的 TCP 接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。 窗口大小的值是指,从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。
- 例如,假如确认号是 701 ,窗口字段是 1000。这就表明,从 701 号算起,发送此报文段的一方还有接收 1000 (字节序号是 701 ~ 1700) 个字节的数据的接收缓存空间。
- 校验和 TCP Checksum
- 占 2 个字节。 由发送端填充,接收端对 TCP 报文段执行 CRC 算法,以检验 TCP 报文段在传输过程中是否损坏,如果损坏这丢弃。
- 检验范围包括首部和数据两部分,这也是 TCP 可靠传输的一个重要保障。
- 紧急指针 Urgent Pointer
- 占 2 个字节。 仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数。 当 URG = 1 时,发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。
3.UDP协议
3.1UDP(User Datagram Protocol) 用户数据报协议。
- UDP 是网络模型传输层中的一种协议,为网络层以上和应用层以下的程序提供了接口,他不保证传输的可靠性,网络交互和协议栈处理开销比较小,适用于对耗时要求较高但对报文可靠性要求不高的应用程序使用。
3.2 UDP协议特点
- UDP是无连接的,即通信时不需要创建连接(发送数据结束时也没有连接可以释放)所以减小了开销和发送数据前的时延;
- UDP采用最大努力交付,不保证可靠交付,因此主机不需要维护复杂的连接状态;
- UDP是面向报文的,只在应用层交下来的报文前增加了首部后就向下交付IP层;
- UDP是无阻塞控制的,即使网络中存在阻塞,也不会影响发送端的发送频率
- UDP支持一对一、一对多、多对一、多对多的交互通信
- UDP的首部开销小,只有8个字节,它比TCP的20个字节的首部要短。
3.3UDP的数据格式:
- 16位的UDP长度
- 包含了,首部长度 + 数据长度(主要目的是为了占位,并没有实际用处,因为可以通过网路层的头算出这个值)。 不管是TCP还是UDP都可以通过网路层的首部推算出来。网络层的总长度减去网络层首部,再减去8就是传输层UDP数据的长度。
- 16位的UDP检验和
- 检验和的计算内容,伪首部 + 首部 + 数据。
- 伪首部:仅在计算检验和的时候起作用,并不会传递给网络层。
4.TCP与UDP协议区别
- TCP是基于连接的、可靠的通信协议,适用于对数据准确性要求高,但是速度可以相对慢的应用。 比如文件传输、收发邮件、Web应用。
- UDP是在主机之间建立快速、轻便、不可靠的数据传输通道。UDP协议适用于有实时要求,但是对质量要求没那么高的应用。 如:在线视频、QQ聊天、网络语音电话。
- 功能特性TCPUDP连接性面向连接无连接可靠性可靠传输,不丢包不可靠传输,尽最大努力交付,可能丢包首部占用空间大小传输速率慢快资源消耗大小应用场景浏览器,文件传输,邮件发送音视频通话,直播应用层协议HTTP,HTTPS,FTP,SMTP,DNSDNS
5.三次握手和四次挥手
5.1三次握手
- 客户端将标志位SYN置为1,随机产生一个值Seq=j,并将该数据包发 送给服务端,客户端进入SYN_SENT状态,等待服务端确认。
- 服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1,Ack=j+1,随机产生一个Seq=K,并将该数据包发送给客户端进行确认连接请求,服务端进入SYN_RCVD状态。
- 客户端收到确认后,检查Ack是否为j+1,ACK是否为1,如果正确则将标志位ACK置为1,Ack=K+1,并将数据包发送给服务端,服务端检查Ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器进入ESTABKISHED状态,完成三次握手,随后客户端和服务器端就可以开始传输数据了。
5.2四次挥手
- 客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。
- 第二次挥手:服务端收到FIN后,发送一个ACK 给客户端,确认号为收到的序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态。
- 第三次挥手:服务端发送一个FIN,用来关闭服务端和客户端的数据传送,服务端进入LAST_ACK状态。
- 第四次挥手:客户端收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给服务端,确认号为收到的序号+1,服务端进入CLOSED状态,完成四次挥手。
5.3为什么握手需要三次,两次不可以吗?
不可以。最主要的目的是为了防止server一直等待,浪费资源。
为什么只有两次握手的时候Server会一直等待?
- 假设client发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达server
- 本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发出的一个新的连接请求
- 于是server就向client发出确认报文段,同意建立连接
- 如果不采用“3次握手”,那么只要server发出确认,新的连接就建立了
- 由于现在client并没有真正想连接服务器的意愿,因此不会理睬server的确认,也不会向server发送数据
- 但server却以为新的连接已经建立,并一直等待client发来数据,这样,server的很多资源就白白浪费掉了
5.4为什么释放连接需要4次挥手?
TCP是全双工模式,主机1和主机2可以同时互相发送数据。
- 第1次挥手:当主机1发出FIN报文段时 表示主机1告诉主机2,主机1已经没有数据要发送了,但是,此时主机1还是可以接受来自主机2的数据
- 第2次挥手:当主机2返回ACK报文段时表示主机2已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的。如果这时就彻底断开连接,主机2就没有办法将剩余数据发送给主机1了。
- 第3次挥手:当主机2也发送了FIN报文段时表示主机2告诉主机1,主机2已经没有数据要发送了
- 第4次挥手:当主机1返回ACK报文段时表示主机1已经知道主机2没有数据发送了。随后正式断开。
6.IP地址分类
- A类地址:以00开头,第一个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255
- B类地址:以10开头,前两个字节作为网络号,地址范围为:128.0.0.0~191.255.255.255
- C类地址:以110开头,前三位字节作为网络号,地址范围为:192.0.0.0~223.255.255.255
- D类地址:以1110开头,地址范围是224.0.0.o~239.255.255.255,D类地址作为组播地址
- E类地址:以1111开头,地址范围是240.0.0.~255.255.255.255,E类地址为保留地址,供以后使用
- ABC类私有地址
- A类范围10.0.0.0-10.255.255.255
- B类范围172.16.0.0-172.31.255.255
- C类范围192.168.0.0-192.168.255.255
7.IP数据包结构
IP数据包由首部和数据两部分组成。
版本(Version): 版本占4位,表示使用的是IPv6还是IPv4。 0b0100:IPv4, 0b0110:IPv6。
首部长度(Header Length): 首部长度占4位,二进制乘以4才是最终长度。 规定首部0b0101: 最小值是20个字节 , 二进制的值是5,乘上4就是20,所以首部最小长度就是20. 首部长度全为1,0b1111,二进制是15,乘上4就是60,所以首部的最大长度就是60个字节。
区分服务(Differentiated Services Field): 区分服务占8个比特位,可以提交网络的服务质量,其实就是包传输的优先级,如果一包数据的这8个比特位设置了值,就会优先传输此包。
总长度(Total Length): 占16位。 16位能够表示的最大值是65536。 由于数据链路层没帧数据不能超过1500字节,所以当IP数据包过大时就要分片。 分片就是将数据过大的IP包拆成数据链路层能够接受的小包数据,每个小包数据都是一个完整的IP数据包。
标识(Identification): 占16位。 数据包的ID,每包数据都有一个ID,这个ID就是这个标识,当数据包的数量过大时,需要进行分片处理,会分成多个包,同一个数据包的所有片的标识都是一样的。 ID是被一个计数器管理起来的,每发出一个包,ID就加1。
标志(Flags): 标志占3位。 第一位:保留。 第二位:1 代表不允许分片,0代表允许分片。 第三位:1代表不是最后一片,0代表是最后一片(这一位数据非常重要,它关系到我们能够完整的接受到数据)
片偏移(Fragment Offset): 占13位。 片偏移乘以8就是字节偏移数。 所以每一片数据的长度一定是8的倍数。 组装分片数据流程: 分片之后,每一片数据都是一个完成的IP数据包,这些IP数据包在接收到之后顺序是错乱的,这时就需要偏移来排序。字节偏移数为0就表示这是第一包数据,然后根据第一包数据的首部信息就可以算出这包数据的长度,那么0加上第一包数据的长度就是第二包数据的字节偏移数,如果此时发现第二包数据的 标志 的第三位是0,就表示这是最后一片数据了,组装分片完成。如果是1,继续上诉的组装操作。 注意:分片是因为网络层的包太大,而ICMP协议是网络层协议,所以能够直接使用ping一个很大的包让网络层分片。但实际从传输层下来的数据早就已经切分了,切成了一个帧能够容纳的大小,所以凡是从传输层来的数据,网络层都不需要切片。
生存时间(Time To Live): 占8位。 路由器在转发之前都会将TTL减1,一旦发现TTL减为了0,路由器会返回错误报告。 并且每个系统都有默认的TTL,通过ping命令后面的TTL,可以推测出对方的操作系统,中间经过了多少个路由器。
协议(Protocol): 占8位,表明所封装的数据是使用什么协议。
首部检验和(Header Checksum): 用于检查首部是否错误。
8、常见的网络协议
(1)TCP/IP协议
TCP/IP是分层协议,如层次图所示:从底层到应用层,分别是物理层,链路层,网络层,传输层,应用层。数据是层层封装,封装的方式一般都是在原有数据的前面加一个数据控制头。
(2)Telnet协议
Telnet是TCP/IP中的一种应用协议,可以为终端仿真提供支持。可使用户连接到主机上,使主机响应起来就像它直接连接在终端上一样。Telnet在发送端和接收端使用TCP的23号端口以进行专用的通信。
(3)FTP协议
FTP协议使用TCP20号和21号端口,20号端口用于数据交换,21号端口用于建立连接,允许目录和文件访问,上传下载,不能远程执行文件。
TFTP是简单文件传输协议(Trivial File Transfer Protocol,TFTP),TFTP是无连接的,使用UDP的69号端口,用于当数据传输错误无关紧要而且无须安全性时的小型文件的传输。
(4)SMTP协议
SMTP是简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是为网络系统间的电子邮件交换而设计的。使用 25 端口。SMTP只需要在接收端的一个电子邮件地址即可发送邮件。POP3 协议用来接收邮件.使用110端口
(5)DNS服务
DNS是域名解析服务(Domain Name Service, DNS),作用是将域名转换为IP地址,或将IP地址转换为域名,用于解析完全合格域名(FQDN)。使用53号端口。
(6)DHCP服务
DHCP是动态主机配置协议(DHCP),服务器可以提供的信息有:
9.HTTP协议详解
9.1 HTTP请求过程
- 解析输入的url,获取域名对应的IP地址。先搜索本地 DNS 缓存有没有对对应的ip地址,若缓存中没有会向域名服务器发起一个 DNS 解析请求去获取ip地址。
- 拿到 IP 地址后,浏览器就向该 IP 所在的服务器建立 TCP 连接。
- 连接建立起来之后,浏览器就向服务器发起 HTTP 请求
- 服务器接收到http请求后,根据路径参数,经过后台一些处理之后,把处理后的HTML 页面代码返回给浏览器。
- 浏览器拿到 HTML 页面代码,根据拿到的资源对页面进行渲染,最终把完整的页面呈现给用户。
- 如果浏览器没有后续的请求,那么就会跟服务器端发起 TCP 断开(即四次挥手)。
9.2HTTP 基本概念
9.2.1 URL
- URL:Uniform Resource Locator,统一资源定位符;
9.2.2 超文本
超文本:hypertext,主要是指HTML代码。
9.2.3 HTTP/HTTPS
协议:数据的传输格式,只有客户端和服务端都规训这些规范,就可以正常传输数据。
HTTP:Hyper Text Transfer Protocol ,超文本传输协议
HTTPS:Hyper Text Transfer Protocol over Secure Socker Layer,是安全的HTTP数据通道,经过了SSL加密,可以认为是HTTP的安全版本,通过HTTPS传输的数据都是加密的,HTTP传输的数据都是明文。
9.3 请求
请求分为四个部分:请求方法(Request Method)、请求链接(Request URL)、请求头(Request Headers)、请求体(Request Body)。
GET 请求报文实例:
请求方法
- GET 向服务器获取指定资源
- POST 向服务器提交数据,数据放在请求体里
- PUT 与POST相似,只是具有幂等特性,一般用于更新
- DELETE 删除服务器指定资源
请求URL:请求链接
请求头:提供一些服务端使用的参数
- Accept:请求报头域,用于告诉服务端,客户端可以接收什么类型的信息,例如:Accept:text/html,表示客户端可以接收HTML格式的信息。
- Accept-Charset:当前客户端可以接受的字符编码。例如:Accept-Charset:utf-8,表示客户端可以接受utf-8编码。
- Accept-Encoding:当前客户端可以接受的页面编码。服务器在发给客户端数据的时候会将数据先根据请求数据中的Accept-Charset进行编码,然后对数据进行压缩,也就是说通过Accept-Encoding中可以接受的压缩算法进行压缩,这会有效减小网络压力,同时也减小了对客户端的延时。
- Accept-Language:指定客户端可接受的语言列表。
- Content-Type:请求体的文档类型,譬如:Context-Type:application/x-www-form-urlencoded 表示请求体是一个表单。
- Cookie:储存在本地的数据,通常以key-value形式存储。
- Host:服务端的域名和端口
- Referer:用来标识这个请求是哪个页面发过来的。
- User-Agent:用于表示客户端的操作系统和浏览器的版本。
请求体
- 请求数据就放一些发送的数据,一般 GET 请求会将参数放在 URL 中,也就是在请求头中而请求正文一般为空,而 POST 请求将参数放在请求正文中。请求正文可以传一些 json 数据或者字符串等等。
- Content-Type提交的数据类型application/x-www-form-urlencoded表单multipart/form-data上传的文件application/jsonJSON格式的数据text/xmlXML格式的数据
9.4 响应
分为三个部分:响应状态码(Response Status Code)、响应头(Response Headers)、响应体(Response Body)。
HTTP/1.1 200 OK 状态行
Date: Sun, 17 Mar 2017 08:12:54 GMT 响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
空行
响应数据
HTTP响应示例
Hello HTTP!
状态码
- 1xx -- 信息提示(表示临时的响应。客户端在收到常规响应之前,准备接收一个或多个1xx响应)
- 100 (Continue/继续):如果服务器收到头信息中带有100-continue的请求,这是指客户端询问是否可以在后续的请求中发送附件。
- 101 (Switching Protocols/转换协议):是指服务器将按照其上的头信息变为一个不同的协议。
- 2xx -- 成功(表明服务器成功地接受了客户端请求)
- 200表示服务器响应成功,也就是服务器找到了客户端请求的内容,并且将内容返回给客户端。
- 201 (Created/已创建):表示服务器在请求的响应中建立了新文档;应在定位头信息中给出它的URL。
- 202 (Accepted/接受):告诉客户端请求正在被执行,但还没有处理完。
- 203 (Non-Authoritative Information/非官方信息):表示文档被正常的返回,但是由于正在使用的是文档副本所以某些响应头信息可能不正确。
- 204 (No Content/无内容):
- 3xx -- 重定向(客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求)
- 300 (Multiple Choices/多重选择):表示被请求的文档可以在多个地方找到,并将在返回的文档中列出来。如果服务器有首选设置,首选项将会被列于定位响应头信息中。
- 301 (Moved Permanently/永久移动):是指所请求的文档在别的地方;文档新的URL会在定位响应头信息中给出。浏览器会自动连接到新的URL。
- 302 (Found/临时移动):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
- 304 (Not Modified/未修改)是指缓冲的版本已经被更新并且客户端应刷新文档。
- 305 (Use Proxy/使用代理):表示所请求的文档要通过定位头信息中的代理服务器获得。
- 4xx -- 客户端错误(发送错误,客户端有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份证验证信息)
- 400 (Bad Request/错误请求):指出客户端请求中的语法错误。
- 401 (Unauthorized/未授权):表示客户端在授权头信息中没有有效的身份信息时访问受到密码保护的页面。
- 403 (Forbidden/禁止):意思是除非拥有授权否则服务器拒绝提供所请求的资源。这个状态经常会由于服务器上的损坏文件或目录许可而引起。
- 404 (Not Found/未找到):告诉客户端所给的地址无法找到任何资源。
- 405 (Method Not Allowed/方法未允许):指出请求方法(GET, POST, HEAD, PUT, DELETE, 等)对某些特定的资源不允许使用。
- 406 (Not Acceptable/无法访问):表示请求资源的MIME类型与客户端中Accept头信息中指定的类型不一致。
- 407 (Proxy Authentication Required/代理服务器认证要求):与401状态有些相似,只是这个状态用于代理服务器。该状态指出客户端必须通过代理服务器的认证。代理服务器返回一个Proxy-Authenticate响应头信息给客户端,这会引起客户端使用带有Proxy-Authorization请求的头信息重新连接。
- 408 (Request Timeout/请求超时):是指服务端等待客户端发送请求的时间过长。
- 413 (Request Entity Too Large/请求实体过大):告诉客户端现在所请求的文档比服务器现在想要处理的要大。
- 414 (Request URI Too Long/请求URI过长):状态用于在URI过长的情况时。这里所指的“URI”是指URL中主机、域名及端口号之后的内容。
- 415 (Unsupported Media Type/不支持的媒体格式):意味着请求所带的附件的格式类型服务器不知道如何处理。
- 5xx -- 服务器错误(服务器由于遇到错误而不能完成该请求)
- 500 (Internal Server Error/内部服务器错误): 是常用的“服务器错误”状态。该状态经常由CGI程序引起,也可能由无法正常运行的或返回头信息格式不正确的servlet引起。
- 501 (Not Implemented/未实现):告诉客户端服务器不支持请求中要求的功能。例如,客户端执行了如PUT这样的服务器并不支持的命令。
- 502 (Bad Gateway/错误的网关):被用于充当代理或网关的服务器;该状态指出接收服务器接收到远端服务器的错误响应。
- 503 (Service Unavailable/服务无法获得):表示服务器由于在维护或已经超载而无法响应。例如,如果某些线程或数据库连接池已经没有空闲则servlet会返回这个头信息。服务器可提供一个Retry-After头信息告诉客户端什么时候可以在试一次。
- 504 (Gateway Timeout/网关超时):该状态也用于充当代理或网关的服务器;它指出接收服务器没有从远端服务器得到及时的响应
- 505 (HTTP Version Not Supported/不支持的 HTTP 版本):服务器并不支持在请求中所标明 HTTP 版本。
响应头:
- Content-Type:响应体中的数据属于什么类型,如text/plain表示纯文本类型,text/html表示HTML文档类型,image/png表示png格式图像类型。
- Date:表示产生响应的时间。
- Content-Encoding:响应内容的编码,如gzip表示响应体中的数据是gzip压缩格式。
- Server:包含服务器的信息,如服务器的名称、版本等。
- Set-Cookie:设置Cookis,Set-Cookie将要保存到客户端的Cookie发送给浏览器,当浏览器下次要访问该页面时会携带这些Cookie。
- Expires:指定缓存过期事件。
响应数据
10.get和post区别
(1)get是从服务器获取数据的,而post是向服务器提交数据的;
(2)get请求通过拼接url进行传递参数,而post请求通过body体传递参数;
(3)get请求会被缓存到浏览历史记录里,而post中的参数不会被缓存;
(4)get一般传输数据大小不有限制(根据浏览器不同,限制不一样,一般2-4k);post请求传输数据的大小无限制。
(5)GET产生一个TCP数据包,POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
11.HTTP和HTTPS协议区别?
- HTTP 明文传输,数据都是未加密的,安全性较差;HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
- HTTP和HTTPS用的默认端口不一样,HTTP默认是80端口;HTTPS默认是443端口。
- 使用 HTTPS 协议需要到 CA申请证书,一般免费证书较少,因而需要一定费用;而HTTP不需要证书。
12.常见的POST提交数据方式?
Content-Type | 提交的数据类型 |
application/x-www-form-urlencoded | 表单 |
multipart/form-data | 上传的文件 |
application/json | JSON格式的数据 |
text/xml | XML格式的数据 |