最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Web开发学习总结1

IT圈 admin 2浏览 0评论

Web开发学习总结1

目录

一、网络分层模型

1.OSI七层模型

2.TCP/IP四层模型

2.1 链路层

2.2 网络层

2.3 传输层

2.4 应用层

3.补充网络概念

二、网络通信

1.网络通信流程

2.IP地址解析

3.TCP连接

3.1 三次握手&四次挥手

3.2 socket套接字

4.HTTP连接

三、HTTP协议

1.简介

1.1 概念

1.2 特点

2.HTTP请求报文

2.1 请求行

2.2 请求头

2.3 请求体

3.HTTP响应报文

3.1 响应行

3.2 响应头

3.3 响应体

4.HTTP传参

5.GET与POST

6.补充内容

5.1 一次完整的HTTP通信过程

5.2 Cookie与Session

5.实战:HTTP请求

四、Web服务器与应用服务器

1.网站文档分类

2.Web服务器

3.应用程序服务器

4.补充说明

5.Tomcat

五、网站访问完整流程


一、网络分层模型

  • OSI:七层,是一种理论下的模型。OSI先有模型,后有协议,先有标准,后进行实践。
  • TCP/IP:四层,已被广泛使用,成为网络互联事实上的标准。先有协议和应用再提出了模型,且是参照的OSI模型。

1.OSI七层模型

  • 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
  • 链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1。MAC地址在这层,唯一表示网络中的一台主机,ARP需要学习一下。
  • 网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。IP选址及路由选择,IP协议。
  • 传输层:定义了一些传输数据的协议(TCP/UDP)和端口号。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。建立、管理和维护端到端的连接。
  • 会话层:通过传输层(端口号:传输端口接收端口)建立数据传输的通路。建立、管理和维护会话,DNS。
  • 表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。数据格式转换、数据加密。
  • 应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。HTTP、FTP、SFTP等协议。

从上文发现,HTTP与FTP是同层次的网络协议,都是用于在客户端和服务器之间传输数据的文件传输协议。因此了解一下他们的区别:HTTP和FTP之间有哪些区别

2.TCP/IP四层模型

OSI七层网络模型

TCP/IP四层概念模型  

作用

对应网络协议

应用层(Application)

应用层

规定数据格式,对数据进行封装、解封

HTTP、TFTP, FTP, NFS, WAIS、SMTP

表示层(Presentation)

Telnet, Rlogin, SNMP, Gopher

会话层(Session)

SMTP, DNS

传输层(Transport)

传输层

对数据进行分段传输

TCP, UDP

网络层(Network)

网络层

寻址

IP, ICMP, ARP, RARP, AKP, UUCP

数据链路层(Data Link)

数据链路层

物理层面上寻址与传输

FDDI, Ethernet, Arpanet, PDN, SLIP, PPP

物理层(Physical)

IEEE 802.1A, IEEE 802.2到IEEE 802.11

2.1 链路层

以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡。通过网卡能够使不同的计算机之间连接,从而完成数据通信等功能。网卡的地址——MAC 地址(全球唯一),就是数据包的物理发送地址和物理接收地址。(我的Linux学习总结6_网络管理中有网卡查看的相关内容。)

核心协议:ARP(地址解析:借助IP获取MAC地址,并不是将IP翻译成MAC地址。)

  • MAC地址:物理地址,和网卡绑定,出厂时已固定,具有唯一性。(全球唯一)
  • IP地址:逻辑地址,基于网络拓扑,由管理员分配,不具备唯一性。(在自己所属的局域网中唯一)

补充:网卡上绑定的IP地址,通常所说的IPV4,一块网卡可以绑定多个IP地址。在绑定IP地址时注意:windows主机会提示IP地址冲突,而Linux主机无任何提示,在添加新的IP地址时务必检测一下新地址是否和原有地址冲突,避免造成访问不可用。常用检测命令:ping或arping IP。

2.2 网络层

网络层的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做“网络地址”,这是我们平时所说的IP地址。网络层协议包含的主要信息是源IP和目的IP。

核心协议:IP协议。

IP和MAC的作用:

  • IP地址:帮助我们确定计算机所在的子网络。(个人理解:根据IP和子网掩码判断网段)
  • MAC地址:则将数据包送到该子网络中的目标网卡。

处理顺序:从逻辑上可以推断,必定是先处理网络地址,然后再处理 MAC 地址。请参考下文的IP地址解析部分。

2.3 传输层

端口:在一台主机上唯一标识一个进程。

核心协议:TCP/UDP。

  • TCP:传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据。(流式Socket,面向连接)
  • UDP:用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的。(数据报式Socket,无连接)

通过网络层IP确认交互端,通过MAC确认信息发送目标,最终通过端口指定要发生信息交互的程序。

通信过程注意点:

  1. MAC地址(不需要用户指定): (ARP 协议) IP -> MAC。
  2. IP 地址 (需要用户指定):确定主机。
  3. port 端口号 (需要用户指定):确定程序。
  4. 不能使用系统占用的默认端口。 5000+ 端口我们使用 (8080)。端口上限为65535。

2.4 应用层

接到传输层传递过来的数据就要对数据进行解析,应用层就是规定程序的数据格式,对数据进行封装、解封。

  • TPC/IP协议是传输层协议,主要解决数据如何在网络中传输。
  • HTTP是应用层协议,主要解决如何包装数据。

3.补充网络概念

  • 网卡:网络适配器,用于数据的封装和解封、数据的编码和译码、链路管理。
  • 网桥:将相似的局域网连接,扩展网络距离和范围;(变成1个更大的局域网)过滤通讯量,提高性能和安全性。(被交换机取代,交换机有时也被称为多端口网桥,功能一致,主要是端口、分段、性能方面的差异)
  • 网关:将两个高层协议不同的网络互连。(还是两个网络,只不过能够通信。路由器又可以称之为网关设备,在网络间起网关的作用。网关是一种概念,路由器是实现网关功能的具体产品。)参考:网关_百度百科(网关,主要看前半部分,从4开始没必要深入了解,可以不看)
  • 代理:也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。A想要访问的B网站被禁掉,于是向代理C发送报文,报文的目的IP是C的IP所以不会被禁掉,报文在应用层会明确告诉代理,自己的真是需求是访问B,由代理C去访问B并响应A的请求。(代理连接的是两个或者多个使用相同协议的应用程序。)
  • VPN:虚拟专用网络。在公用网络上建立专用网络,进行加密通讯。让外地员工访问到内网资源,利用VPN的解决方法就是在内网中架设一台VPN服务器。外地员工在当地连上互联网后,通过互联网连接VPN服务器,然后通过VPN服务器进入企业内网。为了保证数据安全,VPN服务器和客户机之间的通讯数据都进行了加密处理。有了数据加密,就可以认为数据是在一条专用的数据链路上进行安全传输,就如同专门架设了一个专用网络一样,但实际上VPN使用的是互联网上的公用链路,因此VPN称为虚拟专用网络,其实质上就是利用加密技术在公网上封装出一个数据通讯隧道。(代理仅隐藏自己的IP地址,VPN加密连接。)

之前脑子混乱了,还想着远程控制,远程控制的是公司的电脑,间接使用公司网络;而VPN能直接访问公司网络。

二、网络通信

1.网络通信流程

  • 封装: 应用层 -> 传输层 -> 网络层 -> 链路层 。 没有经过封装的数据,不能在网络环境中传递。
  • 解封装 : 链路层 -> 网络层 -> 传输层 -> 应用层。

2.IP地址解析

参考:IP地址解析 - 熊畅_Giser - 博客园(IP地址解析、广域网&局域网、子网掩码)

参考:域名系统_百度百科(DNS域名解析)

参考:计算机网络中MAC地址与IP地址_灰太狼的小秘密-CSDN博客_ip地址和mac地址的区别(数据报文在网络中的传输、转发)

局域网中的私有IP地址接入Internet,需要使用NAT服务器(网络地址转换,允许一个整体机构以一个公用IP地址出现在Internet上。顾名思义,它是一种把内部私有IP地址翻译成合法网络IP地址的技术。与代理服务器功能相似,但NAT在网络层,替换地址;代理服务器在应用层,侧重于应用)。

既然主机之间的连接最终通过MAC地址连接的为什么还要IP地址:

  1. ARP用来寻找同一个局域网中的主机,同一个局域网的IP地址的网络号相同。每个主机的IP地址并不固定,MAC地址固定。==》因此最终根据目标主机的mac地址寻找。
  2. 不同局域网的主机通信时,通过IP地址的网络号可以减少查找的次数,快速找到目标主机。==》因此中间要使用IP地址。

3.TCP连接

  • 在HTTP的规范内,两台计算机的交互被视为request和response的传递。而在实际的TCP操作中,信息传递会比单纯的传递request和response要复杂。通过TCP建立的通讯往往需要计算机之间多次的交换信息才能完成一次request或response。
  • TCP的传输数据的核心是在于将数据分为若干段并将每段数据按顺序标记。标记后的顺序可以以不同的顺序被另一方接收并集成回完整的数据。计算机对每一段数据的成功接收都会做出相应,确保所有数据的完整性。

3.1 三次握手&四次挥手

TCP连接需要经过三次握手,断开连接需要经过四次挥手。连接使用的socket请参考上文传输层部分。

三次握手:1. 客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认2. 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态3. 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手 
我:ESTABLISHED状态应该就是netstat监听到的端口状态四次挥手:1. 主动关闭连接请求端, 发送 FIN2. 被动关闭连接请求端 ,应答 ACK标志。半关闭完成。 —— close()3. 被动关闭连接请求端 ,发送 FIN4.  主动关闭连接请求端,应答 ACK标志。四次挥手建立完成。 —— close().
  • 为什么A发出请求并且得到认可后B还有重复同样的动作:在建立连接的过程中SYN标记代表的是一个随机序列号,因为当文件被切断的时候并不是从0或者1开始标记每段的顺序,所以双方都需要通过传递SYN来告知文件片段的第一个序列是多少号。
  • 三次和四次握手的区别在于,在建立连接时,B的ACK和SYN会一起发送回A,而在断开链接时因为B发送ACK之后还要做其他处理后才能返回FIN,,因此将两步拆开。
  • SYN攻击就是利用三次握手的第二次握手时进行的,这时候服务器处于SYN_RECV状态,等待客户端进行确认ACK,SYN会伪造不存在的源IP,就会有大量的链接处于等待或重试发送SYN+ACK包,导致该阶段队列持续增长,进而导致后续正常的请求被丢弃。

3.2 socket套接字

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:

  • 连接使用的协议
  • 本地主机的IP地址
  • 本地进程的协议端口
  • 远地主机的IP地址
  • 远地进程的协议端口。

网络通信过程中,socket 一定是成对出现的。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

  1. 在TCP/IP协议中,“IP地址+TCP或UDP端口号” 唯一标识网络通讯中的一个进程。
  2. IP地址+端口号:对应一个socket。
  3. 欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。
  4. socket来描述网络连接的一对一关系。
  5. 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。

套接字连接过程:

  1. 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
  2. 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  3. 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户 端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

Socket是对TCP/IP协议的封装和应用(程序员层面上),本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 

实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等。

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

4.HTTP连接

参考下文HTTP协议。

三、HTTP协议

1.简介

1.1 概念

HTTP协议:即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

HTTP协议版本:

  • HTTP 1.0:短连接,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。(TCP短连接)
  • HTTP 1.1:长连接,可以在一次连接中处理多个请求。(TCP长连接,处理多个HTTP请求)
  • HTTP 2.0:长连接,多路复用、头部数据压缩、服务器推送,一个连接中可以并行请求。

客户端定时请求:

  • 要保持客户端程序的在线状态,需要不断地向服务器发起连接请求,通常情况下即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
  • TCP连接是双向的,HTTP协议是建立在TCP协议之上,但不代表HTTP也是双向的,恰恰相反,HTTP只能由客户端发起请求,服务器端无法主动向客户端推送数据,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。(比如页面刷新)

1.2 特点

  • 支持客户端/服务器模式。客户端会向服务器传送不同的请求(request),而服务器会对应每个请求给出回应(response)。
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  • 灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。
  • 无连接:无连接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接,采用这种方式可以节省时间。(注意HTTP/1.1的长连接)
  • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就比较快。

其他特点:

  • 客户端的请求被定义在几个动词意义范围内。最常用到的是GET和POST,其他动词还包括DELETE, HEAD等等。
  • 服务器的回应被定义在几个状态码之间:5开头表示服务器错误,4开头表示客户端错误,3开头表示需要做进一步处理,2开头表示成功,1开头表示在请求被接受处理的同时提供的额外信息。
  • 不管是客户端的请求信息还是服务器的回应,双方都拥有一块头部信息(Header)。头部信息是自定义,其用途在于传递额外信息(浏览器信息、请求的内容类型、相应的语言)。

2.HTTP请求报文

HTTP协议使用TCP协议进行传输,在应用层协议发起交互之前,首先是TCP的三次握手。完成了TCP三次握手后,客户端会向服务器发出一个请求报文。

HTTP请求报文由3部分组成:请求行、请求头、请求体。

2.1 请求行

请求行由3部分组成:

  • 请求方法:GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
  • 请求URL:和报文头的Host属性组成完整的请求URL。
  • HTTP协议及版本。
HTTP方法作用描述
GET客户端请求指定资源信息,服务器返回指定资源
HEAD只请求响应报文中的 HTTP首部
POST将客户端的数据提交到服务器,例:注册表单
PUT用从客户端向服务器传送的数据取代指定的文档内容。
DELETE请求服务器删除 Request-URI所表示的资源。
MOVE请求服务器将指定的页面移至另一个网络地址。

GET与POST:

  • GET:通过URL提交数据,数据在URL中可以看到;提交的数据大小有限制(因为浏览器对URL的长度有限制)。
  • POST:不是作为URL请求的一部分而是作为标准数据传送给Web服务器,数据放在HTTP包的body中,这就克服了GET方法中的信息无法保密和数据量太小的缺点。

2.2 请求头

请求头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。常见的HTTP请求报文头属性有:

(a) Transport头域:(传输方式)

  • Connection:表示是否需要持久连接。如果服务器看到这里的值为“keep-alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,服务器需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。当值为close时,代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,  当客户端再次发送Request,需要重新建立TCP连接。(Connection是设置连接是否保持,而Cache-Control控制的是服务器获取的数据是否缓存。)
  • Host:发送请求时,该报头域是必需的,主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。eg:http://192.168.1.3:8080/index.html,浏览器发送的请求消息中,就会包含Host请求报头域:Host: 192.168.1.3:8080。

(b) Entity头域:(描述自己报文)

  • Content-Length:发送给HTTP服务器数据的长度。即请求消息正文的长度。
  • Content-Type:发送给HTTP服务器数据的类型,如application/json;charset=UTF-8。

(c) Miscellaneous头域:

  • Referer:提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的。

(d) Cookie/Login头域:(登录授权)

  • Cookie:最重要的header,将cookie的值发送给HTTP 服务器。服务端是怎么知道客户端的多个请求是隶属于一个Session呢?注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原来就是通过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的方式将会话ID附带在每个URL的后面哦)。
  • Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

(e) Cache头域:

  • Cache-Control:这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。Public,可以被任何缓存所缓存;Private,内容只缓存到私有缓存中;no-cache,所有内容都不会被缓存。
  • Pragma:HTTP/1.0头域,防止页面被缓存,只有一个用法, Pragma: no-cache。和HTTP/1.1版本中的Cache-Control:no-cache作用一模一样。
  • If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。
  • If-Modified-Match:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能。例如: If-None-Match: "03f2b33c0bfcc1:0"。

(f) Client头域:(接收申明)

  • Accept:浏览器可以接受的媒体类型(MIME类型)。Accept: text/html  代表浏览器可以接受服务器回发的类型为 text/html  也就是我们常说的html文档, 如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。通配符 * 代表任意类型。例如  Accept: */*  代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。
  • Accept-Encoding:浏览器申明自己接收的编码方法,(注意:这不是指字符编码),通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。许多情形下这可以减少5到10倍的下载时间,也节省带宽。
  • Accept-Charset:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案)。如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
  • Accept-Language: 浏览器申明自己接收的语言。 如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
  • User-Agent:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。

2.3 请求体

请求体将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。

不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。 

对照上面的请求报文,我们把它进一步分解,你可以看到一幅更详细的结构图: 

请求头与请求正文中间有一行空行,是告诉服务器请求头到此结束了接下来是请求正文。

3.HTTP响应报文

HTTP请求报文也是由3部分组成:响应行、响应头、响应体。

3.1 响应行

响应行由报文协议及版本、状态码和状态描述组成。

状态码由3位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有 5 种取值,如下所示:

  • 1xx:指示信息——表示请求已经接受,正在处理。
  • 2xx:成功——表示请求已经被成功接收、理解、接受、处理完成等。
  • 3xx:重定向——让客户端再发起一个请求以完成整个处理。
  • 4xx:客户端错误——请求有语法错误或请求无法实现,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
  • 5xx:服务器端错误——服务器未能实现合法的请求,如服务端抛出异常,路由出错,HTTP版本不支持等。

常见状态代码、状态描述、说明:

  • 200 OK      //客户端请求成功。
  • 400 Bad Request  //客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  • 403 Forbidden  //服务器收到请求,但是拒绝提供服务。
  • 404 Not Found  //请求资源不存在,eg:输入了错误的URL。
  • 500 Internal Server Error //服务器发生不可预期的错误。
  • 503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

3.2 响应头

(a) Transport头域:(传输方式)

  • Connection:见上文。

(b) Location头域:

  • Location:用于重定向一个新的位置, 包含新的URL地址。

(c) Entity实体头域:

  • ETag:和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)
  • Last-Modified:用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)
  • Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。
  • Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。
  • Content-Encoding:文档的编码(Encode)方法。一般是压缩方式。WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。
  • Content-Language:WEB服务器告诉浏览器自己响应的对象的语言者。

(d) Cookie/Login头域:

  • P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题。
  • Set-Cookie: 非常重要的header,服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的。例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/ 。set-cookie段中给出了cookie的id,过期时间以及参数path,path是表示在哪个虚拟目录路径下的页面可以读取使用该cookie,将这些信息发回给客户端后,客户端在以后的http request中就会将自己的cookie段用这些信息填充。如果用户在连接中通过了服务器相应的认证程序,服务器会添加一个cdb_auth到set-cookie中,这个段表示了客户端的认证信息,而客户端以后在访问过程中也会将cdb_auth信息写入自己的cookie字段。服务器每次收到http request后读取cookie,然后根据cookie的信息返回不同的页面。例如,没有通过认证的客户端在request中不会有cdb_auth,因此服务器读取cookie后,不会将通过认证的客户端的页面返回给该客户端。

(e) Cache头域:

  • Cache-Control:响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。 例如:Cache-Control: max-age=3600 该设置让客户端对响应内容缓存3600秒,也即在3600秒内,如果客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取 。(当然,这个功能是靠客户端实现的,服务端只是通过这个属性提示客户端“应该这么做”,做不做,还是决定于客户端,如果是自己宣称支持HTTP的客户端,则就应该这样实现) 
  • Date:生成消息的具体时间和日期,即当前的GMT时间。
  • Expires:浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。

(f) Miscellaneous头域:

  • Server:指明HTTP服务器的软件信息。
  • X-Powered-By:表示网站是用什么技术开发的。

3.3 响应体

emmm,好像没啥好说的。

4.HTTP传参

@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如:

  • @PathParam来自于URL的路径。(?前的路径中取出字符串)
  • @QueryParam来自于URL的查询参数。(?后的键值对)
  • @HeaderParam来自于HTTP请求的头信息。
  • @CookieParam来自于HTTP请求的Cookie。

5.GET与POST

本质区别:GET 和 POST 到底有什么区别? - 知乎(写的很好)

参数传递:SpringBoot请求参数传递与接收 - 编程小大白 - 博客园(在找到更好的之前,先用这篇,结合项目来看)

建议:postman、抓包等都用用。

6.补充内容

5.1 一次完整的HTTP通信过程

浏览器F12查看到的请求就是浏览器发送给Tomcat的HTTP请求。

  1. 建立TCP连接:在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。
  2. Web浏览器向Web服务器发送请求命令:一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET /sample/hello.jsp HTTP/1.1。
  3. Web浏览器发送请求头信息:浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。(请求体是否是这之后发送)
  4. Web服务器应答:客户机向服务器发出请求后,服务器会客户机回送应答,HTTP/1.1 200 OK 应答的第一部分是协议的版本号和应答状态码。
  5. Web服务器发送应答头信息:正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
  6. Web服务器向浏览器发送数据:Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
  7. Web服务器关闭TCP连接:一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了 Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

5.2 Token、Cookie、Session

参考:Token ,Cookie和Session的区别 - 王菜鸟1993 - 博客园

(a) Cookie与Session产生原因

Web程序是使用HTTP协议传输的,而HTTP协议是无状态的协议,对于事务处理没有记忆能力。每次服务端(如Tomcat)接收到客户端(浏览器)的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;所以当用户从客户端请求一次登录后,登录成功,再次进行请求时,因为Tomcat不能识别这两次会话都是来自同一个浏览器,即服务端不知道客户端的历史请求记录;就会再次弹出登录对话框。

  • 如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
  • 另一方面,在服务器不需要先前信息时它的应答就较快。

为了弥补HTTP无状态的特性,解决客户端与服务端会话同步问题,这便引出了下面几个概念:cookie、session。

(b) Cookie与Session的定义

  • cookie:实际上是一小段文本信息,由服务器创建,通过response传给客户端,由客户端保存。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
  • session:同样是记录客户状态的机制,客户端请求服务端,服务端(Tomcat)会为这次请求开辟一块内存空间,这个对象便是Session对象, 存储结构为ConcurrentHashMap。服务器可以利用session存储客户端在同一个会话期间的一些操作记录。

区别:

  • 数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • 安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
  • 服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
  • 数据大小:大多数浏览器支持单cookie最大容量为4K,很多浏览器都限制一个站点最多保存20个cookie。
  • 信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

(c) 实现机制

服务器通过session id判断客户端发过来的请求是否属于同一个会话。(在tomcat中session id中用JSESSIONID来表示)

  1. 服务器第一次接收到请求时,开辟了一块Session空间(创建了Session对象),同时生成一个Session id,并通过响应头的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应;
  2. 客户端收到响应后,在本机客户端设置了一个JSESSIONID=XXXXXXX的cookie信息,该cookie的过期时间为浏览器会话结束;
  3. 接下来客户端每次向同一个网站发送请求时,请求头都会带上该cookie信息(包含Session id); 
  4. 服务器通过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,得到此次请求的Session id;

注意:服务器只会在客户端第一次请求响应的时候,在响应头上添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,接下来在同一个会话的第二第三次响应头里,是不会添加Set- Cookie:“JSESSIONID=XXXXXXX”信息的; 而客户端是会在每次请求头的cookie中带上JSESSIONID信息。

(d) 生存周期

  • cookie:Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。 如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。

    如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除。

  • session:由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

登录超时是session控制,在tomcat中设置超时时间。cookie的生存周期通常比session长一点,存储不太重要的内容,最重要的是存储session ID,session过期后找不到对应ID的session就会提示登录超时。

补充学习:理解Cookie和Session机制 - Andrew.Zhou - 博客园

  • 服务端tomcat设置,在webapps目录下具体组件中查看配置以及引用的Java文件。
  • 禁用cookie后解决方案:URL重写。

5.实战:HTTP请求

四、Web服务器与应用服务器

1.网站文档分类

通常,根据确定文档内容的时间,所有文档可以划分为如下三类:

  • 静态Web文档:静态文档的作者在写作的时候确定文档的内容。由于文档内容不会变化,所以对静态文档的每次访问都返回相同结果。(优点:简单、可靠性和性能。缺点:不灵活。)
  • 动态Web文档:浏览器访问Web服务器时创建。当一个请求到达时,web服务器运行一个应用程序创建动态文档,服务器返回程序的输出作为应答。由于每次访问都要创建新的文档,动态文档的内容是变化的。(优点:报告当前信息的能力。缺点:增加成本,不能显示变化的信息。)
  • 活动文档:一个活动文档不完全由服务器一端说明,而是包括一个计算并显示值的程序。当浏览器访问活动文档时,服务器返回一个浏览器可以本地执行的程序。当该程序运行时,它可以和用户交互执行并不停地改变显示。这样,活动文档的内容是不固定的-只要用户让程序保持运行,它总是在不停地变化。(优点:持续更改信息的能力。缺点:创建和运行文档需要的额外扩展,缺少安全性。)

注意:从浏览器的角度来看,动态文档和静态文档是无区别的。由于动态文档和静态文档都采用HTML编写,浏览器采用和静态文档同样的方法访问动态文档,浏览器不知道服务器是从一个磁盘文件还是计算机程序中取得文档。和静态文档类似,动态文档在浏览器取得文档后不会再改变。因此在信息发送给浏览器之后,文档就开始过时。例如一个报告股市信息的动态文档,由于股市信息变化迅速,当用户访问时文档很快就过时。

2.Web服务器

Web服务器(Web Server)也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务,可以解析HTTP协议,向发出请求的浏览器提供文档。当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面。为了处理一个请求,Web服务器可以响应一个静态页面或图片, 进行页面跳转,或者把动态响应的产生委托给一些其它的程序例如CGI、JSP、servlets、ASP脚本,服务器端JavaScript,或者一些其它的服务器端技术。无论脚本的目的如何,Web服务器通常产生一个HTML的响应来让浏览器可以浏览。

Web服务器的代理模型:当一个请求被送到Web服务器里来时,它只单纯的把请求传递给可以很好的处理请求的程序。Web服务器仅仅提供一个可以执行服务器端程序和返回响应的环境,而不会超出职能范围。服务器端程序通常具有事务处理,数据库连接和消息等功能。

虽然Web服务器不支持事务处理或数据库连接池,但它可以配置各种策略来实现容错性和可扩展性,例如负载平衡、缓冲。集群特征经常被误认为仅仅是应用程序服务器专有的特征。

最常用的Web服务器:Apache和微软的信息服务器(Internet Information Services,IIS)。

3.应用程序服务器

应用程序服务器(Application Server)通过各种协议,可以包括HTTP,把商业逻辑暴露给客户端应用程序。提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就像你调用对象的一个方法(或过程语言中的一个函数)一样。应用程序服务器的客户端(包含有图形用户界面GUI的)可能会运行在一台PC、一个Web服务器或者甚至是其它的应用程序服务器上。

4.补充说明

XML Web Services已经使应用程序服务器和Web服务器的界线混淆了。通过传送一个XML有效载荷给服务器,Web服务器现在可以处理数据和响应的能力与以前的应用程序服务器同样多了。

另外,大多数应用程序服务器也包含了Web服务器,这就意味着可以把Web服务器当作是应用程序服务器的一个子集。

虽然应用程序服务器包含了Web服务器的功能,但是开发者很少把应用程序服务器部署成这种功能(指既有应用程序服务器的功能又有Web服务器的功能)。相反,如果需要,他们通常会把Web服务器独立配置,和应用程序服务器一前一后。这种功能的分离有助于提高性能(简单的Web请求就不会影响应用程序服务器了),分开配置(专门的Web服务器,集群等等),而且给最佳产品的选取留有余地。

5.Tomcat

参考:

五、网站访问完整流程

一次完整的访问:终极解密!输入网址按回车到底发生了什么?

session、cookie结合实际梳理

认证鉴权、HTTPClient代码稍微写写(socket代码也要看看)。

J2EE、Servlet、Java Bean、EJB、JSP

Web开发学习总结1

目录

一、网络分层模型

1.OSI七层模型

2.TCP/IP四层模型

2.1 链路层

2.2 网络层

2.3 传输层

2.4 应用层

3.补充网络概念

二、网络通信

1.网络通信流程

2.IP地址解析

3.TCP连接

3.1 三次握手&四次挥手

3.2 socket套接字

4.HTTP连接

三、HTTP协议

1.简介

1.1 概念

1.2 特点

2.HTTP请求报文

2.1 请求行

2.2 请求头

2.3 请求体

3.HTTP响应报文

3.1 响应行

3.2 响应头

3.3 响应体

4.HTTP传参

5.GET与POST

6.补充内容

5.1 一次完整的HTTP通信过程

5.2 Cookie与Session

5.实战:HTTP请求

四、Web服务器与应用服务器

1.网站文档分类

2.Web服务器

3.应用程序服务器

4.补充说明

5.Tomcat

五、网站访问完整流程


一、网络分层模型

  • OSI:七层,是一种理论下的模型。OSI先有模型,后有协议,先有标准,后进行实践。
  • TCP/IP:四层,已被广泛使用,成为网络互联事实上的标准。先有协议和应用再提出了模型,且是参照的OSI模型。

1.OSI七层模型

  • 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
  • 链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1。MAC地址在这层,唯一表示网络中的一台主机,ARP需要学习一下。
  • 网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。IP选址及路由选择,IP协议。
  • 传输层:定义了一些传输数据的协议(TCP/UDP)和端口号。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。建立、管理和维护端到端的连接。
  • 会话层:通过传输层(端口号:传输端口接收端口)建立数据传输的通路。建立、管理和维护会话,DNS。
  • 表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。数据格式转换、数据加密。
  • 应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。HTTP、FTP、SFTP等协议。

从上文发现,HTTP与FTP是同层次的网络协议,都是用于在客户端和服务器之间传输数据的文件传输协议。因此了解一下他们的区别:HTTP和FTP之间有哪些区别

2.TCP/IP四层模型

OSI七层网络模型

TCP/IP四层概念模型  

作用

对应网络协议

应用层(Application)

应用层

规定数据格式,对数据进行封装、解封

HTTP、TFTP, FTP, NFS, WAIS、SMTP

表示层(Presentation)

Telnet, Rlogin, SNMP, Gopher

会话层(Session)

SMTP, DNS

传输层(Transport)

传输层

对数据进行分段传输

TCP, UDP

网络层(Network)

网络层

寻址

IP, ICMP, ARP, RARP, AKP, UUCP

数据链路层(Data Link)

数据链路层

物理层面上寻址与传输

FDDI, Ethernet, Arpanet, PDN, SLIP, PPP

物理层(Physical)

IEEE 802.1A, IEEE 802.2到IEEE 802.11

2.1 链路层

以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡。通过网卡能够使不同的计算机之间连接,从而完成数据通信等功能。网卡的地址——MAC 地址(全球唯一),就是数据包的物理发送地址和物理接收地址。(我的Linux学习总结6_网络管理中有网卡查看的相关内容。)

核心协议:ARP(地址解析:借助IP获取MAC地址,并不是将IP翻译成MAC地址。)

  • MAC地址:物理地址,和网卡绑定,出厂时已固定,具有唯一性。(全球唯一)
  • IP地址:逻辑地址,基于网络拓扑,由管理员分配,不具备唯一性。(在自己所属的局域网中唯一)

补充:网卡上绑定的IP地址,通常所说的IPV4,一块网卡可以绑定多个IP地址。在绑定IP地址时注意:windows主机会提示IP地址冲突,而Linux主机无任何提示,在添加新的IP地址时务必检测一下新地址是否和原有地址冲突,避免造成访问不可用。常用检测命令:ping或arping IP。

2.2 网络层

网络层的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做“网络地址”,这是我们平时所说的IP地址。网络层协议包含的主要信息是源IP和目的IP。

核心协议:IP协议。

IP和MAC的作用:

  • IP地址:帮助我们确定计算机所在的子网络。(个人理解:根据IP和子网掩码判断网段)
  • MAC地址:则将数据包送到该子网络中的目标网卡。

处理顺序:从逻辑上可以推断,必定是先处理网络地址,然后再处理 MAC 地址。请参考下文的IP地址解析部分。

2.3 传输层

端口:在一台主机上唯一标识一个进程。

核心协议:TCP/UDP。

  • TCP:传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据。(流式Socket,面向连接)
  • UDP:用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的。(数据报式Socket,无连接)

通过网络层IP确认交互端,通过MAC确认信息发送目标,最终通过端口指定要发生信息交互的程序。

通信过程注意点:

  1. MAC地址(不需要用户指定): (ARP 协议) IP -> MAC。
  2. IP 地址 (需要用户指定):确定主机。
  3. port 端口号 (需要用户指定):确定程序。
  4. 不能使用系统占用的默认端口。 5000+ 端口我们使用 (8080)。端口上限为65535。

2.4 应用层

接到传输层传递过来的数据就要对数据进行解析,应用层就是规定程序的数据格式,对数据进行封装、解封。

  • TPC/IP协议是传输层协议,主要解决数据如何在网络中传输。
  • HTTP是应用层协议,主要解决如何包装数据。

3.补充网络概念

  • 网卡:网络适配器,用于数据的封装和解封、数据的编码和译码、链路管理。
  • 网桥:将相似的局域网连接,扩展网络距离和范围;(变成1个更大的局域网)过滤通讯量,提高性能和安全性。(被交换机取代,交换机有时也被称为多端口网桥,功能一致,主要是端口、分段、性能方面的差异)
  • 网关:将两个高层协议不同的网络互连。(还是两个网络,只不过能够通信。路由器又可以称之为网关设备,在网络间起网关的作用。网关是一种概念,路由器是实现网关功能的具体产品。)参考:网关_百度百科(网关,主要看前半部分,从4开始没必要深入了解,可以不看)
  • 代理:也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。A想要访问的B网站被禁掉,于是向代理C发送报文,报文的目的IP是C的IP所以不会被禁掉,报文在应用层会明确告诉代理,自己的真是需求是访问B,由代理C去访问B并响应A的请求。(代理连接的是两个或者多个使用相同协议的应用程序。)
  • VPN:虚拟专用网络。在公用网络上建立专用网络,进行加密通讯。让外地员工访问到内网资源,利用VPN的解决方法就是在内网中架设一台VPN服务器。外地员工在当地连上互联网后,通过互联网连接VPN服务器,然后通过VPN服务器进入企业内网。为了保证数据安全,VPN服务器和客户机之间的通讯数据都进行了加密处理。有了数据加密,就可以认为数据是在一条专用的数据链路上进行安全传输,就如同专门架设了一个专用网络一样,但实际上VPN使用的是互联网上的公用链路,因此VPN称为虚拟专用网络,其实质上就是利用加密技术在公网上封装出一个数据通讯隧道。(代理仅隐藏自己的IP地址,VPN加密连接。)

之前脑子混乱了,还想着远程控制,远程控制的是公司的电脑,间接使用公司网络;而VPN能直接访问公司网络。

二、网络通信

1.网络通信流程

  • 封装: 应用层 -> 传输层 -> 网络层 -> 链路层 。 没有经过封装的数据,不能在网络环境中传递。
  • 解封装 : 链路层 -> 网络层 -> 传输层 -> 应用层。

2.IP地址解析

参考:IP地址解析 - 熊畅_Giser - 博客园(IP地址解析、广域网&局域网、子网掩码)

参考:域名系统_百度百科(DNS域名解析)

参考:计算机网络中MAC地址与IP地址_灰太狼的小秘密-CSDN博客_ip地址和mac地址的区别(数据报文在网络中的传输、转发)

局域网中的私有IP地址接入Internet,需要使用NAT服务器(网络地址转换,允许一个整体机构以一个公用IP地址出现在Internet上。顾名思义,它是一种把内部私有IP地址翻译成合法网络IP地址的技术。与代理服务器功能相似,但NAT在网络层,替换地址;代理服务器在应用层,侧重于应用)。

既然主机之间的连接最终通过MAC地址连接的为什么还要IP地址:

  1. ARP用来寻找同一个局域网中的主机,同一个局域网的IP地址的网络号相同。每个主机的IP地址并不固定,MAC地址固定。==》因此最终根据目标主机的mac地址寻找。
  2. 不同局域网的主机通信时,通过IP地址的网络号可以减少查找的次数,快速找到目标主机。==》因此中间要使用IP地址。

3.TCP连接

  • 在HTTP的规范内,两台计算机的交互被视为request和response的传递。而在实际的TCP操作中,信息传递会比单纯的传递request和response要复杂。通过TCP建立的通讯往往需要计算机之间多次的交换信息才能完成一次request或response。
  • TCP的传输数据的核心是在于将数据分为若干段并将每段数据按顺序标记。标记后的顺序可以以不同的顺序被另一方接收并集成回完整的数据。计算机对每一段数据的成功接收都会做出相应,确保所有数据的完整性。

3.1 三次握手&四次挥手

TCP连接需要经过三次握手,断开连接需要经过四次挥手。连接使用的socket请参考上文传输层部分。

三次握手:1. 客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认2. 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态3. 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手 
我:ESTABLISHED状态应该就是netstat监听到的端口状态四次挥手:1. 主动关闭连接请求端, 发送 FIN2. 被动关闭连接请求端 ,应答 ACK标志。半关闭完成。 —— close()3. 被动关闭连接请求端 ,发送 FIN4.  主动关闭连接请求端,应答 ACK标志。四次挥手建立完成。 —— close().
  • 为什么A发出请求并且得到认可后B还有重复同样的动作:在建立连接的过程中SYN标记代表的是一个随机序列号,因为当文件被切断的时候并不是从0或者1开始标记每段的顺序,所以双方都需要通过传递SYN来告知文件片段的第一个序列是多少号。
  • 三次和四次握手的区别在于,在建立连接时,B的ACK和SYN会一起发送回A,而在断开链接时因为B发送ACK之后还要做其他处理后才能返回FIN,,因此将两步拆开。
  • SYN攻击就是利用三次握手的第二次握手时进行的,这时候服务器处于SYN_RECV状态,等待客户端进行确认ACK,SYN会伪造不存在的源IP,就会有大量的链接处于等待或重试发送SYN+ACK包,导致该阶段队列持续增长,进而导致后续正常的请求被丢弃。

3.2 socket套接字

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:

  • 连接使用的协议
  • 本地主机的IP地址
  • 本地进程的协议端口
  • 远地主机的IP地址
  • 远地进程的协议端口。

网络通信过程中,socket 一定是成对出现的。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

  1. 在TCP/IP协议中,“IP地址+TCP或UDP端口号” 唯一标识网络通讯中的一个进程。
  2. IP地址+端口号:对应一个socket。
  3. 欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。
  4. socket来描述网络连接的一对一关系。
  5. 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。

套接字连接过程:

  1. 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
  2. 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  3. 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户 端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

Socket是对TCP/IP协议的封装和应用(程序员层面上),本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 

实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等。

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

4.HTTP连接

参考下文HTTP协议。

三、HTTP协议

1.简介

1.1 概念

HTTP协议:即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

HTTP协议版本:

  • HTTP 1.0:短连接,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。(TCP短连接)
  • HTTP 1.1:长连接,可以在一次连接中处理多个请求。(TCP长连接,处理多个HTTP请求)
  • HTTP 2.0:长连接,多路复用、头部数据压缩、服务器推送,一个连接中可以并行请求。

客户端定时请求:

  • 要保持客户端程序的在线状态,需要不断地向服务器发起连接请求,通常情况下即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
  • TCP连接是双向的,HTTP协议是建立在TCP协议之上,但不代表HTTP也是双向的,恰恰相反,HTTP只能由客户端发起请求,服务器端无法主动向客户端推送数据,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。(比如页面刷新)

1.2 特点

  • 支持客户端/服务器模式。客户端会向服务器传送不同的请求(request),而服务器会对应每个请求给出回应(response)。
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  • 灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。
  • 无连接:无连接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接,采用这种方式可以节省时间。(注意HTTP/1.1的长连接)
  • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就比较快。

其他特点:

  • 客户端的请求被定义在几个动词意义范围内。最常用到的是GET和POST,其他动词还包括DELETE, HEAD等等。
  • 服务器的回应被定义在几个状态码之间:5开头表示服务器错误,4开头表示客户端错误,3开头表示需要做进一步处理,2开头表示成功,1开头表示在请求被接受处理的同时提供的额外信息。
  • 不管是客户端的请求信息还是服务器的回应,双方都拥有一块头部信息(Header)。头部信息是自定义,其用途在于传递额外信息(浏览器信息、请求的内容类型、相应的语言)。

2.HTTP请求报文

HTTP协议使用TCP协议进行传输,在应用层协议发起交互之前,首先是TCP的三次握手。完成了TCP三次握手后,客户端会向服务器发出一个请求报文。

HTTP请求报文由3部分组成:请求行、请求头、请求体。

2.1 请求行

请求行由3部分组成:

  • 请求方法:GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
  • 请求URL:和报文头的Host属性组成完整的请求URL。
  • HTTP协议及版本。
HTTP方法作用描述
GET客户端请求指定资源信息,服务器返回指定资源
HEAD只请求响应报文中的 HTTP首部
POST将客户端的数据提交到服务器,例:注册表单
PUT用从客户端向服务器传送的数据取代指定的文档内容。
DELETE请求服务器删除 Request-URI所表示的资源。
MOVE请求服务器将指定的页面移至另一个网络地址。

GET与POST:

  • GET:通过URL提交数据,数据在URL中可以看到;提交的数据大小有限制(因为浏览器对URL的长度有限制)。
  • POST:不是作为URL请求的一部分而是作为标准数据传送给Web服务器,数据放在HTTP包的body中,这就克服了GET方法中的信息无法保密和数据量太小的缺点。

2.2 请求头

请求头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。常见的HTTP请求报文头属性有:

(a) Transport头域:(传输方式)

  • Connection:表示是否需要持久连接。如果服务器看到这里的值为“keep-alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,服务器需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。当值为close时,代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,  当客户端再次发送Request,需要重新建立TCP连接。(Connection是设置连接是否保持,而Cache-Control控制的是服务器获取的数据是否缓存。)
  • Host:发送请求时,该报头域是必需的,主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。eg:http://192.168.1.3:8080/index.html,浏览器发送的请求消息中,就会包含Host请求报头域:Host: 192.168.1.3:8080。

(b) Entity头域:(描述自己报文)

  • Content-Length:发送给HTTP服务器数据的长度。即请求消息正文的长度。
  • Content-Type:发送给HTTP服务器数据的类型,如application/json;charset=UTF-8。

(c) Miscellaneous头域:

  • Referer:提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的。

(d) Cookie/Login头域:(登录授权)

  • Cookie:最重要的header,将cookie的值发送给HTTP 服务器。服务端是怎么知道客户端的多个请求是隶属于一个Session呢?注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原来就是通过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的方式将会话ID附带在每个URL的后面哦)。
  • Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

(e) Cache头域:

  • Cache-Control:这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。Public,可以被任何缓存所缓存;Private,内容只缓存到私有缓存中;no-cache,所有内容都不会被缓存。
  • Pragma:HTTP/1.0头域,防止页面被缓存,只有一个用法, Pragma: no-cache。和HTTP/1.1版本中的Cache-Control:no-cache作用一模一样。
  • If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。
  • If-Modified-Match:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能。例如: If-None-Match: "03f2b33c0bfcc1:0"。

(f) Client头域:(接收申明)

  • Accept:浏览器可以接受的媒体类型(MIME类型)。Accept: text/html  代表浏览器可以接受服务器回发的类型为 text/html  也就是我们常说的html文档, 如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。通配符 * 代表任意类型。例如  Accept: */*  代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。
  • Accept-Encoding:浏览器申明自己接收的编码方法,(注意:这不是指字符编码),通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。许多情形下这可以减少5到10倍的下载时间,也节省带宽。
  • Accept-Charset:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案)。如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
  • Accept-Language: 浏览器申明自己接收的语言。 如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
  • User-Agent:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。

2.3 请求体

请求体将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。

不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。 

对照上面的请求报文,我们把它进一步分解,你可以看到一幅更详细的结构图: 

请求头与请求正文中间有一行空行,是告诉服务器请求头到此结束了接下来是请求正文。

3.HTTP响应报文

HTTP请求报文也是由3部分组成:响应行、响应头、响应体。

3.1 响应行

响应行由报文协议及版本、状态码和状态描述组成。

状态码由3位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有 5 种取值,如下所示:

  • 1xx:指示信息——表示请求已经接受,正在处理。
  • 2xx:成功——表示请求已经被成功接收、理解、接受、处理完成等。
  • 3xx:重定向——让客户端再发起一个请求以完成整个处理。
  • 4xx:客户端错误——请求有语法错误或请求无法实现,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
  • 5xx:服务器端错误——服务器未能实现合法的请求,如服务端抛出异常,路由出错,HTTP版本不支持等。

常见状态代码、状态描述、说明:

  • 200 OK      //客户端请求成功。
  • 400 Bad Request  //客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  • 403 Forbidden  //服务器收到请求,但是拒绝提供服务。
  • 404 Not Found  //请求资源不存在,eg:输入了错误的URL。
  • 500 Internal Server Error //服务器发生不可预期的错误。
  • 503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

3.2 响应头

(a) Transport头域:(传输方式)

  • Connection:见上文。

(b) Location头域:

  • Location:用于重定向一个新的位置, 包含新的URL地址。

(c) Entity实体头域:

  • ETag:和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)
  • Last-Modified:用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)
  • Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。
  • Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。
  • Content-Encoding:文档的编码(Encode)方法。一般是压缩方式。WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。
  • Content-Language:WEB服务器告诉浏览器自己响应的对象的语言者。

(d) Cookie/Login头域:

  • P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题。
  • Set-Cookie: 非常重要的header,服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的。例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/ 。set-cookie段中给出了cookie的id,过期时间以及参数path,path是表示在哪个虚拟目录路径下的页面可以读取使用该cookie,将这些信息发回给客户端后,客户端在以后的http request中就会将自己的cookie段用这些信息填充。如果用户在连接中通过了服务器相应的认证程序,服务器会添加一个cdb_auth到set-cookie中,这个段表示了客户端的认证信息,而客户端以后在访问过程中也会将cdb_auth信息写入自己的cookie字段。服务器每次收到http request后读取cookie,然后根据cookie的信息返回不同的页面。例如,没有通过认证的客户端在request中不会有cdb_auth,因此服务器读取cookie后,不会将通过认证的客户端的页面返回给该客户端。

(e) Cache头域:

  • Cache-Control:响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。 例如:Cache-Control: max-age=3600 该设置让客户端对响应内容缓存3600秒,也即在3600秒内,如果客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取 。(当然,这个功能是靠客户端实现的,服务端只是通过这个属性提示客户端“应该这么做”,做不做,还是决定于客户端,如果是自己宣称支持HTTP的客户端,则就应该这样实现) 
  • Date:生成消息的具体时间和日期,即当前的GMT时间。
  • Expires:浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。

(f) Miscellaneous头域:

  • Server:指明HTTP服务器的软件信息。
  • X-Powered-By:表示网站是用什么技术开发的。

3.3 响应体

emmm,好像没啥好说的。

4.HTTP传参

@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如:

  • @PathParam来自于URL的路径。(?前的路径中取出字符串)
  • @QueryParam来自于URL的查询参数。(?后的键值对)
  • @HeaderParam来自于HTTP请求的头信息。
  • @CookieParam来自于HTTP请求的Cookie。

5.GET与POST

本质区别:GET 和 POST 到底有什么区别? - 知乎(写的很好)

参数传递:SpringBoot请求参数传递与接收 - 编程小大白 - 博客园(在找到更好的之前,先用这篇,结合项目来看)

建议:postman、抓包等都用用。

6.补充内容

5.1 一次完整的HTTP通信过程

浏览器F12查看到的请求就是浏览器发送给Tomcat的HTTP请求。

  1. 建立TCP连接:在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。
  2. Web浏览器向Web服务器发送请求命令:一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET /sample/hello.jsp HTTP/1.1。
  3. Web浏览器发送请求头信息:浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。(请求体是否是这之后发送)
  4. Web服务器应答:客户机向服务器发出请求后,服务器会客户机回送应答,HTTP/1.1 200 OK 应答的第一部分是协议的版本号和应答状态码。
  5. Web服务器发送应答头信息:正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
  6. Web服务器向浏览器发送数据:Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
  7. Web服务器关闭TCP连接:一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了 Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

5.2 Token、Cookie、Session

参考:Token ,Cookie和Session的区别 - 王菜鸟1993 - 博客园

(a) Cookie与Session产生原因

Web程序是使用HTTP协议传输的,而HTTP协议是无状态的协议,对于事务处理没有记忆能力。每次服务端(如Tomcat)接收到客户端(浏览器)的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;所以当用户从客户端请求一次登录后,登录成功,再次进行请求时,因为Tomcat不能识别这两次会话都是来自同一个浏览器,即服务端不知道客户端的历史请求记录;就会再次弹出登录对话框。

  • 如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
  • 另一方面,在服务器不需要先前信息时它的应答就较快。

为了弥补HTTP无状态的特性,解决客户端与服务端会话同步问题,这便引出了下面几个概念:cookie、session。

(b) Cookie与Session的定义

  • cookie:实际上是一小段文本信息,由服务器创建,通过response传给客户端,由客户端保存。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
  • session:同样是记录客户状态的机制,客户端请求服务端,服务端(Tomcat)会为这次请求开辟一块内存空间,这个对象便是Session对象, 存储结构为ConcurrentHashMap。服务器可以利用session存储客户端在同一个会话期间的一些操作记录。

区别:

  • 数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • 安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
  • 服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
  • 数据大小:大多数浏览器支持单cookie最大容量为4K,很多浏览器都限制一个站点最多保存20个cookie。
  • 信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

(c) 实现机制

服务器通过session id判断客户端发过来的请求是否属于同一个会话。(在tomcat中session id中用JSESSIONID来表示)

  1. 服务器第一次接收到请求时,开辟了一块Session空间(创建了Session对象),同时生成一个Session id,并通过响应头的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应;
  2. 客户端收到响应后,在本机客户端设置了一个JSESSIONID=XXXXXXX的cookie信息,该cookie的过期时间为浏览器会话结束;
  3. 接下来客户端每次向同一个网站发送请求时,请求头都会带上该cookie信息(包含Session id); 
  4. 服务器通过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,得到此次请求的Session id;

注意:服务器只会在客户端第一次请求响应的时候,在响应头上添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,接下来在同一个会话的第二第三次响应头里,是不会添加Set- Cookie:“JSESSIONID=XXXXXXX”信息的; 而客户端是会在每次请求头的cookie中带上JSESSIONID信息。

(d) 生存周期

  • cookie:Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。 如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。

    如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除。

  • session:由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

登录超时是session控制,在tomcat中设置超时时间。cookie的生存周期通常比session长一点,存储不太重要的内容,最重要的是存储session ID,session过期后找不到对应ID的session就会提示登录超时。

补充学习:理解Cookie和Session机制 - Andrew.Zhou - 博客园

  • 服务端tomcat设置,在webapps目录下具体组件中查看配置以及引用的Java文件。
  • 禁用cookie后解决方案:URL重写。

5.实战:HTTP请求

四、Web服务器与应用服务器

1.网站文档分类

通常,根据确定文档内容的时间,所有文档可以划分为如下三类:

  • 静态Web文档:静态文档的作者在写作的时候确定文档的内容。由于文档内容不会变化,所以对静态文档的每次访问都返回相同结果。(优点:简单、可靠性和性能。缺点:不灵活。)
  • 动态Web文档:浏览器访问Web服务器时创建。当一个请求到达时,web服务器运行一个应用程序创建动态文档,服务器返回程序的输出作为应答。由于每次访问都要创建新的文档,动态文档的内容是变化的。(优点:报告当前信息的能力。缺点:增加成本,不能显示变化的信息。)
  • 活动文档:一个活动文档不完全由服务器一端说明,而是包括一个计算并显示值的程序。当浏览器访问活动文档时,服务器返回一个浏览器可以本地执行的程序。当该程序运行时,它可以和用户交互执行并不停地改变显示。这样,活动文档的内容是不固定的-只要用户让程序保持运行,它总是在不停地变化。(优点:持续更改信息的能力。缺点:创建和运行文档需要的额外扩展,缺少安全性。)

注意:从浏览器的角度来看,动态文档和静态文档是无区别的。由于动态文档和静态文档都采用HTML编写,浏览器采用和静态文档同样的方法访问动态文档,浏览器不知道服务器是从一个磁盘文件还是计算机程序中取得文档。和静态文档类似,动态文档在浏览器取得文档后不会再改变。因此在信息发送给浏览器之后,文档就开始过时。例如一个报告股市信息的动态文档,由于股市信息变化迅速,当用户访问时文档很快就过时。

2.Web服务器

Web服务器(Web Server)也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务,可以解析HTTP协议,向发出请求的浏览器提供文档。当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面。为了处理一个请求,Web服务器可以响应一个静态页面或图片, 进行页面跳转,或者把动态响应的产生委托给一些其它的程序例如CGI、JSP、servlets、ASP脚本,服务器端JavaScript,或者一些其它的服务器端技术。无论脚本的目的如何,Web服务器通常产生一个HTML的响应来让浏览器可以浏览。

Web服务器的代理模型:当一个请求被送到Web服务器里来时,它只单纯的把请求传递给可以很好的处理请求的程序。Web服务器仅仅提供一个可以执行服务器端程序和返回响应的环境,而不会超出职能范围。服务器端程序通常具有事务处理,数据库连接和消息等功能。

虽然Web服务器不支持事务处理或数据库连接池,但它可以配置各种策略来实现容错性和可扩展性,例如负载平衡、缓冲。集群特征经常被误认为仅仅是应用程序服务器专有的特征。

最常用的Web服务器:Apache和微软的信息服务器(Internet Information Services,IIS)。

3.应用程序服务器

应用程序服务器(Application Server)通过各种协议,可以包括HTTP,把商业逻辑暴露给客户端应用程序。提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就像你调用对象的一个方法(或过程语言中的一个函数)一样。应用程序服务器的客户端(包含有图形用户界面GUI的)可能会运行在一台PC、一个Web服务器或者甚至是其它的应用程序服务器上。

4.补充说明

XML Web Services已经使应用程序服务器和Web服务器的界线混淆了。通过传送一个XML有效载荷给服务器,Web服务器现在可以处理数据和响应的能力与以前的应用程序服务器同样多了。

另外,大多数应用程序服务器也包含了Web服务器,这就意味着可以把Web服务器当作是应用程序服务器的一个子集。

虽然应用程序服务器包含了Web服务器的功能,但是开发者很少把应用程序服务器部署成这种功能(指既有应用程序服务器的功能又有Web服务器的功能)。相反,如果需要,他们通常会把Web服务器独立配置,和应用程序服务器一前一后。这种功能的分离有助于提高性能(简单的Web请求就不会影响应用程序服务器了),分开配置(专门的Web服务器,集群等等),而且给最佳产品的选取留有余地。

5.Tomcat

参考:

五、网站访问完整流程

一次完整的访问:终极解密!输入网址按回车到底发生了什么?

session、cookie结合实际梳理

认证鉴权、HTTPClient代码稍微写写(socket代码也要看看)。

J2EE、Servlet、Java Bean、EJB、JSP

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论