【java程序员理解HTTP】【1】HTTP相关知识
2019独角兽企业重金招聘Python工程师标准>>>
参考网页
http://android.jobbole.com/85218/
Http和Tcp/Ip
TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应
HTTP协议就是基于TCP/IP协议模型来传输信息的。
(1). 链路层
也称作数据链路层或网络接口层(在第一个图中为网络接口层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环 网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。
(2). 网络层
也称作互联网层(在第一个图中为网际层),处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。
IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。
ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。
IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。
(3). 传输层
主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。
TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的 分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。为了提供可靠的服务,TCP采用了 超时重传、发送和接收端到端的确认分组等机制。
UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一 端。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。UDP协议任何必需的可靠性必须由应用层来提供。
(4). 应用层
应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务。包括 HTTP,FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统)服务。
★小结
TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应。上层到下层依次为:
应用层
运输层
网络层
链路层(这里已经是物理层,涉及到硬件了)
HTTP、FTP、DNS(Domain Name System,域名系统)属于应用层,TCP属于运输层,IP属于网络层,以太网属于链路层。
★封装-数据进入协议栈时的封装过程
当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如图所示。
★分用-以太网数据帧的分用过程
当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing)。协议是通过目的端口号、源IP地址和源端口号进行解包的。
★封装和分用:通过【数据进入协议栈时的封装过程】和【以太网数据帧的分用过程】从TCP/IP模型的角度来理解了一次HTTP请求与响应的过程,更清晰的图如下
为什么HTTP协议要基于TCP来实现?--HTTP协议属于应用层协议,其需要基于运输层的协议。TCP属于运输层协议,且可靠性强。所以HTTP协议选择了TCP协议
目前在Internet中所有的传输都是通过TCP/IP进行的,HTTP协议作为TCP/IP模型中应用层的协议也不例外,TCP是一个端到端的可靠的面向连接的协议,所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。
★★Http和Tcp/Ip总结
Tcp/Ip是一个协议族,是工程实践中提炼出来的协议组合,可以认为是一个四层协议系统
四层从高到低:应用层(Http、Ftp、DNS)、运输层(TCP)、网络层(IP)、链路层(以太网)。
上层协议要依赖于下层的实现。
http协议在通过网络传输数据的套路
应用(一般为web应用)使用http协议传输数据,数据要通过tcp、ip层到达网络(被当作一串比特流送入网络)。数据从http应用(通过tcp层、ip层)到达网络时变成一串比特流,中间经历了每一层协议的封装。通过网络达到目的机器,又会从协议栈的底层到高层:链路层(以外网)到网络层(ip层)到运输层(tcp层)到应用层(http、ftp、dns),在这个过程中比特流在每一层都会被解析(分用),最终以http响应的格式到底http应用(可能是客户端,比如浏览器、手机app应用,也可能是服务器端,比如nginx服务器、tomcat服务器等)。
发送端发送时:层层封装。
接收端接收后:层层解析。
HTTP协议
Http是什么?
计算机通过网络进行通信的规则,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。目前任何终端(手机,笔记本电脑。。)之间进行任何一种通信都必须按照Http协议进行,否则无法连接。
四个基于:请求响应、无状态、应用层、TCP/IP
请求与响应
客户端发送请求,服务器端响应数据。
无状态的
协议对于事务处理没有记忆能力,客户端第一次与服务器建立连接发送请求时需要进行一系列的安全认证匹配等,因此增加页面等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,两者断开连接,也不保存连接状态,一刀两断!恩断义绝!从此路人!下一次客户端向同样的服务器发送请求时,由于他们之前已经遗忘了彼此,所以需要重新建立连接。
应用层
Http是属于应用层的协议,配合TCP/IP使用。
TCP/IP
Http使用TCP作为它的支撑运输协议。HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP。
针对无状态的一些解决策略
有时需要对用户之前的HTTP通信状态进行保存,比如执行一次登陆操作,在30分钟内所有的请求都不需要再次登陆。于是引入了Cookie技术。
HTTP/1.1想出了持久连接(HTTP keep-alive)方法。其特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接。
还有很多其他方案策略。
HTTP报文--HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文
Http请求报文
请求报文格式:请求命令(请求行)、请求头、空行、请求体
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
请求行
请求行分为三个部分:请求方法、请求地址和协议版本。
请求方法
HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。
请求地址
URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>
端口和路径有时可以省略(HTTP默认端口号是80)(路径可以省略是因为有时会有默认首页)
如下例:
有时会带参数,GET请求
协议版本
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。
常见请求头如下:
User-Agent举例:各种浏览器、fiddler、网络爬虫等。
空行
请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行非常重要,必不可少。
请求数据
可选部分,比如GET请求就没有请求数据。
下面是一个POST方法的请求报文:
POST /index.php HTTP/1.1 请求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 请求头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
空行
username=aa&password=1234 请求数据
Http响应报文
响应报文格式--状态行、响应头部、空行以及响应数据
HTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。
状态行
由3部分组成,分别为:协议版本,状态码,状态码描述。
其中协议版本与请求报文一致,状态码描述是对状态码的简单描述,所以这里就只介绍状态码。
状态码
状态代码为3位数字。
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
常见状态码举例
响应头部
与请求头部类似,为响应报文添加了一些附加信息
常见响应头部如下
空行
空行告知客户端响应头结束,后面为响应数据。
响应数据
用于存放需要返回给客户端的数据信息。
下面是一个响应报文的实例
HTTP/1.1 200 OK 状态行
Date: Sun, 17 Mar 2013 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
空行
<html> 响应数据
<head>
<title>HTTP响应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
http起始行中的请求方法
GET: 完整请求一个资源 (常用)
HEAD: 仅请求响应首部
POST:提交表单 (常用)
PUT: (webdav) 上传
DELETE:(webdav) 删除
OPTIONS:返回请求的资源所支持的方法的方法
TRACE: 追求一个资源请求中间所经过的代理
Spring框架的web包中的请求方法类--RequestMethod
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
http几种协议
http/0.9: stateless
http/1.0: MIME, keep-alive (保持连接), 缓存
http/1.1: 更多的请求方法,更精细的缓存控制,持久连接(persistent connection) 比较常用
什么是MIME?--互联网媒体类型
MIME(Multipurpose Internet Mail Extesions 多用途互联网邮件扩展)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息,这个标准被定义在 RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822,规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各种各样的数据类型的符号化方法。此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型。
MIME 遵循以下格式:major/minor 主类型/次类型
例如:
image/jpg
image/gif
text/html
video/quicktime
appliation/x-httpd-php
appliation/json
HTTP协议有啥用?
技术上基于TCP/IP,是一套应用层面的网络传输协议。
基于HTTP协议,可以开发web服务器端,百度、阿里、360。
基于HTTP协议,可以开发PC和手机端浏览器,各种产品:chrome、ie、Firefox、uc等各种浏览器。
基于HTTP协议,可以开发各种PC客户端应用:优化大师等,现在几乎都是网络应用。
基于HTTP协议,可以开发各种手机app:同花顺、微信、支付宝。
所以基于HTTP协议,可以开发各种产品,只要产品符合HTTP协议即可。
=====================================================================
Chrome发起的http请求报文头部信息举例
字段含义说明
Accept 就是告诉服务器端,我接受那些MIME类型
Accept-Encoding 这个看起来是接受那些压缩方式的文件
Accept-Lanague 告诉服务器能够发送哪些语言
Connection 告诉服务器支持keep-alive特性
Cookie 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端
Host 用来标识请求服务器上的那个虚拟主机,比如Nginx里面可以定义很多个虚拟主机
那这里就是用来标识要访问那个虚拟主机。
User-Agent 用户代理,一般情况是浏览器,也有其他类型,如:wget curl 搜索引擎的蜘蛛等
条件请求首部:If-Modified-Since 是浏览器向服务器端询问某个资源文件如果自从什么时间修改过,那么重新发给我,这样就保证服务器端资源
文件更新时,浏览器再次去请求,而不是使用缓存中的文件
安全请求首部:
Authorization: 客户端提供给服务器的认证信息;
Chrome浏览器看到的响应头信息举例
字段含义说明
Connection 使用keep-alive特性
Content-Encoding 使用gzip方式对资源压缩
Content-type MIME类型为html类型,字符集是 UTF-8
Date 响应的日期
Server 使用的WEB服务器
Transfer-Encoding:chunked 分块传输编码 是http中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用(通常是网页浏览器)的数据可以分成多个部分,分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供
Vary 这个可以参考(http://blog.csdn.net/tenfyguo/article/details/5939000)
X-Pingback 参考(http://blog.sina.com.cn/s/blog_bb80041c0101fmfz.html)
转载于:https://my.oschina.net/u/3866531/blog/1926810
【java程序员理解HTTP】【1】HTTP相关知识相关推荐
- 一网打尽:Java 程序员必须了解的计算机底层知识!
公众号后台回复"面试",获取精品学习资料 扫描下方海报了解专栏详情 本文来自公众号读者cxuan的投稿 我们每个程序员或许都有一个梦,那就是成为大牛,我们或许都沉浸在各种框架中,以 ...
- 非科班的java程序员该如何补充计算机基础知识,需要看哪些书?
java比较特殊,毕竟后端扛霸子,想要认真学好java,必须有好的计算机基础,可是为什么需要基础呢? 把这个问题弄明白,要学哪些基础知识就清楚多了. 第一个问题,10个用户使用的系统和1000000个 ...
- Java程序员需要掌握的计算机底层知识(三):进程、线程、纤程、中断
面试高频问题 问:进程和线程有什么区别? 答:进程是一个程序运行起来的状态(运行态),线程是一个进程中不同的执行路径(线程只是其中一个). 更为专业的回答:进程是操作系统用来分配资源的基本单位,线程是 ...
- Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA
一些书籍 读书的原则:不求甚解,观其大略 你如果进到庐山里头,二话不说,蹲下头来,弯下腰,就对着某棵树某棵小草猛研究而不是说先把庐山的整体脉络跟那研究清楚了,那么你的学习方法肯定效率巨低而且特别痛苦, ...
- Java程序员需要掌握的计算机底层知识(五):内核同步方法
内核同步机制 关于同步理论的一些基本概念 临界区(critical area): 访问或操作共享数据的代码段 简单理解:synchronized大括号中部分(原子性) 竞争条件(race condit ...
- Java程序员需要掌握的计算机底层知识(二):操作系统、内核、用户态与内核态、系统调用的执行过程
操作系统 启动过程 通电 -> bios uefi 工作 -> 自检 -> 到硬盘固定位置加载bootloader -> 读取可配置信息 -> CMOS CMOS 用来存 ...
- Java程序员需要掌握的计算机底层知识(四):内存管理
内存管理 单进程DOS时代 DOS时代 - 同一时间只能有一个进程在运行(也有一些特殊算法可以支持多进程) windows9x - 多个进程装入内存存在的问题: 内存不够用 互相打扰 为了解决这两个问 ...
- 从Java程序员的角度理解加密的那些事
前言 在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(Client)不仅仅需要传递给接口服务(Server)必要的业务参数,还得提供Signature(数 ...
- 越来越多的Java程序员转行Java大数据...
JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入IT行业,首选的第一门语言就是JAVA. 但是,在未来肯定是大数据的天下,人工智能的爆发,将 ...
最新文章
- P2831-愤怒的小鸟【状压dp】
- Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)
- UNIX网络编程笔记(2):一个简单的时间获取程序
- 谷歌Chrome:将逐步阻止浏览器不安全下载内容
- 数据结构之二叉树的物理结构(存储结构)
- 阿里云ECS利用密钥对ssh登录服务器
- WCF,Net remoting,Web service
- 领域驱动设计DDD之读书笔记
- FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)
- How is NGINX Unit different from Apache?
- RepairImages\superboot-6410.bin
- django下载文件异常 - ValueError: read of closed file
- 用这些进行PDF翻译,双语对照、翻译后排版不变、还免费!
- java接口文档怎么写_如何写好API接口文档
- Jetson Nano 系统瘦身 移除libre-office
- xp系统从u盘启动计算机,教你怎么用U盘安装Windows XP系统
- 计算机网络上不去的原因是什么,路由器有信号却上不了网是什么原因?
- 基于springboot+jsp的服装穿搭信息管理系统
- 新加坡企业是怎么做实名认证的?
- 算法珠玑-变位词的四种解法
热门文章
- 降噪滤镜之:Noiseware
- java高级面试视频,持续更新~
- thinkphp3.2对接短信验证码平台代码
- java 项目 q a 表设计_《JAVA程序设计项目案例训练》期末试卷(A卷)..doc
- vb6 datagrid表格垂直居中_实训项目41:表格制作参考样式
- python创建socket对象_python socket对象内建方法
- 【linux】循序渐进学运维-基础篇-top命令
- gitk显示中文乱码
- python创建多线程_Python 多线程,threading模块,创建子线程的两种方式示例
- 才一年,H5的发展就成这样了