计算机网络
Posted 想实习犯法吗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机网络相关的知识,希望对你有一定的参考价值。
文章目录
轻松筹实习时抓包:
计算机网络体系结构
在计算机网络的基本概念中,分层次的体系结构是 基本的。计算机网络体系结
构的抽象概念较多,在学习时要多思考。这些概念对后面的学习很有帮助。
网络协议是什么?
在计算机网络要做到有条不紊地交换数据,就必须遵守一些事先约定好的规则, 比如交换数据的格式、是否需要发送一个应答信息。这些规则被称为网络协议。
为什么要对网络协议分层?
- 简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。
- 灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受 影响。
- 易于实现和维护。
- 促进标准化工作。分开后,每层功能可以相对简单地被描述。
网络协议分层的缺点: 功能可能出现在多个层里,产生了额外开销。 为了使不同体系结构的计算机网络都能互联,国际标准化组织 ISO 于1977年提 出了一个试图使各种计算机在世界范围内互联成网的标准框架,即著名的开放系统互联基本参考模型 OSI/RM,简称为OSI。
OSI 的七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用, TCP/IP 体系结构则不同,但它现在却得到了非常广泛的应用。TCP/IP 是一个四 层体系结构,它包含应用层,运输层,网际层和网络接口层(用网际层这个名字 是强调这一层是为了解决不同网络的互连问题),不过从实质上讲,TCP/IP 只 有上面的三层,因为下面的网络接口层并没有什么具体内容,因此在学习计 算机网络的原理时往往采用折中的办法,即综合 OSI 和 TCP/IP 的优点,采用 一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚,有时为了方 便,也可把底下两层称为网络接口层。
- 四层协议,五层协议和七层协议的关系如下:
- TCP/IP是一个四层的体系结构,主要包括:应用层、运输层、网际层和网络接 口层。
- 五层协议的体系结构主要包括:应用层、运输层、网络层,数据链路层和物理层。
- OSI七层协议模型主要包括是:应用层(Application)、表示层 (Presentation)、会话层(Session)、运输层(Transport)、网络层 (Network)、数据链路层(Data Link)、物理层(Physical)。
注:五层协议的体系结构只是为了介绍网络原理而设计的,实际应用还是 TCP/IP 四层体系结构。
TCP/IP 四层体系结构。 TCP/IP 协议族
应用层
应用层( application-layer )的任务是通过应用进程间的交互来完成特定网络应 用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和 交互的规则。
对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域 名系统 DNS(50),支持万维网应用的 HTTP(80) 协议,支持电子邮件的 SMTP 协议等 等。
应用层交互的数据单元称为报文。
运输层
由于一个主机可同时运行多个进程,因此运输层有复用和分用的功能:
复用,就是多个应用层进程可同时使用下面运输层的服务。
分用,就是把收到的信息分别交付给上面应用层中相应的进程。
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通 用的数据传输服务。应用进程利用该服务传送应用层报文。 运输层主要使用一下两种协议
- 传输控制协议-TCP:提供面向连接的,可靠的数据传输服务。
- 用户数据协议-UDP:提供无连接的,尽大努力的数据传输服务(不 保证数据传输的可靠性)。
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传 输,使用 流量控制 和拥塞控 制 |
连接对象 个数 | 支持一对 一,一对 多,多对 一和多对 多交互通 信 | 只能是一 对一通信 |
传输方式 | 面向报文 | 面向字节 流 |
首部开销 | 首部开销 小,仅8字 节 | 首部小 20字节, 大60字 节 |
场景 | 适用于实 时应用 (IP电 话、视频会议、直 播等) | 适用于要 求可靠传 输的应 用,例如 文件传输 |
每一个应用层(TCP/IP参考模型的最高层)协议一般都会使用到两个传输层协 议之一:
运行在TCP协议上的协议:
- HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏 览。 端口:80
- HTTPS(HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。 端口:443
- FTP(File Transfer Protocol,文件传输协议),用于文件传输。 端口:21
- POP3(Post Office Protocol, version 3,邮局协议),收邮件用。
- SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子 邮件。
- TELNET(Teletype over the Network,网络电传),通过一个终端 (terminal)登陆到网络。 端口:23
- SSH(Secure Shell,用于替代安全性差的TELNET), 端口:22
- 用于加密安全登陆用。 运行在UDP协议上的协议:
- BOOTP(Boot Protocol,启动协议),应用于无盘设备。
- NTP(Network Time Protocol,网络时间协议),用于网络同步。
- DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态 配置IP地址。 运行在TCP和UDP协议上:
- DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等 工作。 端口:53
从主机到本地dns是递归的,从本地dns获得最终结果像跟服务器,权威服务器等都是迭代查询
网络层
网络层的两个主要任务,分组交换和路由选择,传输的数据单位是IP数据报
网络层的任务就是选择合适的网间路由和交换结点,确保计算机通信的数据及时 传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和 包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称数据报。
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连 接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol) 和许多路由选择协议,因此互联网的网络层也叫做网际层或 IP 层。
数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。
在物理层上所传送的数据单位是帧。
在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装 成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息 (如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特 结束。
每一组数据报分为报头和数据两部分。
head | data
head包含:(固定18个字节)
发送者/源地址,6个字节
接收者/目标地址,6个字节
数据类型,6个字节
data包含:(最短46字节,最长1500字节)
数据包的具体内容
head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送。
一般的web应用的通信传输流是这样的:
发送端在层与层之间传输数据时,每经过一层时会被打上一个该层所属的首部信 息。反之,接收端在层与层之间传输数据时,每经过一层时会把对应的首部信息 去除。
在一个局域网之内计算机是通过广播+以太网协议进行通信的。
物理层
在物理层上所传送的数据单位是比特。
物理层(physical layer)的作用是实现相 邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的 差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送 比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说, 这个电路好像是看不见的。
TCP/IP 协议族
在互联网使用的各种协议中重要和著名的就是 TCP/IP 两个协议。现在人们 经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议,而往往是表 示互联网所使用的整个 TCP/IP 协议族。
互联网协议套件(英语:Internet Protocol Suite,缩写IPS)是一个网络通讯模型, 以及一整个网络传输协议家族,为网际网络的基础通讯架构。它常被通称为TCP/IP协 议族(英语:TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。因为该 协定家族的两个核心协定:TCP(传输控制协议)和IP(网际协议),为该家族中早 通过的标准。
划重点:
TCP(传输控制协议)和IP(网际协议) 是先定义的两个核心协议,所以才统称为TCP/IP协议族
TCP的三次握手四次挥手
TCP的特点:
基于连接的:数据传输之前需要建立连接
全双工的:可以双向传输
字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
流量缓冲:解决双方处理能力的不匹配
可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
拥塞控制:防止网络出现恶性拥塞
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据 前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服 务端保存的一份关于对方的信息,如ip地址、端口号等。
TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问 题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在 TCP头部。
一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连 接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个 链接,通过四次挥手来关闭一个连接。
**当一个连接被建立或被终止时,交换的报文段只包含TCP头部,而没有数据。 **
TCP报文的头部结构
在了解TCP连接之前先来了解一下TCP报文的头部结构。
上图中有几个字段需要重点介绍下:
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流, 发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
ACK 确认值,为1确认连接
ack确认编号,只有ACK确认值为1时才有效
(3)header length4位首部长度给出首部以4字节(32位)为单位的个数,因此TCP首部最大可以达到 (24 -1 ) * 4 = 60字节。如没有可选字段,TCP首部长度为20字节。
(4)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如 下:
(5)receive window 16位的窗口用来实现流量控制
- ACK:确认序号有效。
- FIN:释放一个连接。
- PSH:接收方应该尽快将这个报文交给应用层。
- RST:重置连接。
- SYN:发起一个新连接。
- URG:紧急指针(urgent pointer)有效。
需要注意的是:
- 不要将确认序号ack与标志位中的ACK搞混了。
- 确认方ack=发起方seq+1,两端配对。
(6)检验和覆盖了整个TCP报文段:即TCP首部和TCP数据,这是一个强制性的字段,是由发端计算和存储,并由接收端进行验证
(7)最常见的可选字段是最长报文大小,又称为 MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。
三次握手
三次握手的本质是确认通信双方收发数据的能力。首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的。
于是他给我回信,我若收到了,我便知我的发件能力和他的收件能力是可以的,并且他的发件能力和我的收件能力是可以。
然而此时他还不知道他的发件能力和我的收件能力到底可不可以,于是我 后回馈一次,他若收到了,他便清楚了他的发件能力和我的收件能力是可以的。这,就是三次握手,这样说,你理解了吗?
- 第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1)(SYN=1的报文是不能携带数据的),序列号seq=100。
- 第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)。
- 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号300给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101,ACK报文是可以携带数据的)。当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。
四次挥手
四次挥手的目的是关闭一个连接
比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。
- 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。
- 第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
- 第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。
- 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。
TCP是如何保证可靠传输的?
1、应用数据被分割成 TCP 认为最适合发送的数据块。
2、TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
3、校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
4、TCP 的接收端会丢弃重复的数据。
5、流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
6、拥塞控制: 当网络拥塞时,减少数据的发送。
7、ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
8、超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
常见面试题
为什么TCP连接的时候是3次?2次不可以吗?
为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认
为什么TCP连接的时候是3次,关闭的时候却是4次?
因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。
为什么客户端发出第四次挥手的确认报文后要等2MSL(maximum segment lifetime)的时间才能释放TCP连接?
保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。什么是HTTP,HTTP 与 HTTPS 的区别
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
区别 | HTTP | HTTPS |
---|---|---|
协议 | 运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份 | 身披 SSL( Secure Socket Layer )外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之 上, 是添加了加密和认证机制的 HTTP。 |
端口 | 80 | 443 |
资源消耗 | 较少 | 由于加解密处理,会消耗更 多的 CPU 和内存资源 |
开销 | 无需证书 | 需要证书,而证书一般需要向认证机构购买 |
加密机制 | 无 | 共享密钥加密和公开密钥加密并用的混合加密机制 |
安全性 | 弱 | 由于加密机制,安全性强 |
常用HTTP状态码
HTTP状态码表示客户端HTTP请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等。
状态码的类别:
类别 | 原因短语 |
---|---|
1XX | Informational(信息性状态码)接受的请求正在处理 |
2XX | Success(成功状态码)请求正常处理完毕 |
3XX | Redirection(重定向状态码)需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码)服务器无法处理请求 |
5XX | Server Error(服务器错误状态码)服务器处理请求出错 |
常用HTTP状态码:
2XX | 成功(这系列表明请求被正常处理了) |
---|---|
200 | OK,表示从客户端发来的请求在服务器端被正确处理 |
204 | No content,表示请求成功,但响应报文不含实体的主体部分 |
206 | Partial Content ,进行范围请求成功 |
3XX | 重定向 (表明浏览器要执行特殊处理) |
301 | moved permanently,永久 性重定向,表示资源已被分配了新的 URL |
302 | found,临时性重定向,表示资源临时被分配了新的 URL |
303 | see other,表示资源存在着另一个 URL, 应使用 GET 方法获取资源 (对于 301/302/ 303响应,几乎所有浏览器都会删除报文主体并 自动用 GET重新请求) |
304 | not modified ,表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关) |
307 | temporary redirect,临时重定 向,和302 含义类似,但是期望客户端保持请求方法不变向新的地址发出请求 |
4XX | 客户端错误 |
400 | bad request,请求报文存在语法错误 |
401 | unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息 |
403 | forbidden ,表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述 |
404 | not found,表示在服务器上没有找到请求的资源 |
5XX | 服务器错误 |
500 | internal sever error,表 示服务器端在执行请求时发生了错误 |
501 | Not Implemented,表示服务器不支持当前请求所需要的某个功能 |
503 | service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求 |
GET和POST区别
说道GET和POST,就不得不提HTTP协议,因为浏览器和服务器的交互是通过
HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法。
HTTP全称为Hyper Text Transfer Protocol,中文翻译为超文本传输协议,目的是保证浏览器与服务器之间的通信。HTTP的工作方式是客户端与服务器之间的请求-应答协议。
HTTP协议中定义了浏览器和服务器进行交互的不同方法,基本方法有4种,分别是GET,POST,PUT,DELETE。这四种方法可以理解为,对服务器资源的查,改,增,删。
- GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
- POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。
- PUT:英文含义是放置,也就是向服务器新添加数据,就是所谓的增。
- DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。
GET和POST区别
\\1. Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。 但是这种做法也不时绝对的,大部分人的做法也是按照上面的说法来的,但是也可以在get请求加上 request body,给 post请求带上 URL 参数。
\\2. Get请求提交的url中的数据 多只能是2048字节,这个限制是浏览器或者服务器给添加的,http协议并没有对url长度进行限制,目的是为了保证服务器和浏览器能够正常运行,防止有人恶意发送请求。Post请求则没有大小限制。
\\3. Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个
ISO10646字符集。
\\4. Get执行效率却比Post方法好。Get是form提交的默认方法。
\\5. GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
什么是对称加密与非对称加密
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢
什么是HTTP2
HTTP2 可以提高了网页的性能。
在 HTTP1 中浏览器限制了同一个域名下的请求数量(Chrome 下一般是六个),当在请求很多资源的时候,由于队头阻塞当浏览器达到 大请求数量时,剩余的资源需等待当前的六个请求完成后才能发起请求。
HTTP2 中引入了多路复用的技术,这个技术可以只通过一个 TCP 连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能。
Session、Cookie和Token的主要区别
HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。
什么是cookie
cookie是由Web服务器保存在用户浏览器上的小文件(key-value格式),包含用户相关的信息。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户身份。
什么是session
session是依赖Cookie实现的。session是服务器端对象
session 是浏览器和服务器会话过程中,服务器分配的一块储存空间。服务器默
认为浏览器在cookie中设置 sessionid,浏览器在向服务器请求过程中传输
cookie 包含 sessionid ,服务器根据 sessionid 获取出会话中存储的信息,然后确定会话的身份信息。
cookie与session区别
存储位置与安全性:cookie数据存放在客户端上,安全性较差,session数据放在服务器上,安全性相对更高;
存储空间:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点多保存20个cookie,session无此限制
占用服务器资源:session一定时间内保存在服务器上,当访问增多,占用服务器性能,考虑到服务器性能方面,应当使用cookie。
什么是Token
Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。
Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位 session与token区别
- session机制存在服务器压力增大,CSRF跨站伪造请求攻击,扩展性不强等问题;
- session存储在服务器端,token存储在客户端
- token提供认证和授权功能,作为身份认证,token安全性比session好;
- session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上,token适用于项目级的前后端分离(前后端代码运行在不同的服务器下)
Servlet是线程安全的吗
Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet() 和doPost()方法内。虽然使用synchronized(name)语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的。
Servlet接口中有哪些方法及Servlet生命周期探秘
在Java Web程序中,Servlet主要负责接收用户请求HttpServletRequest,在 doGet(),doPost()中做相应的处理,并将回应HttpServletResponse反馈给用户。Servlet可以设置初始化参数,供Servlet内部使用。
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
- void init(ServletConfig config) throws ServletException
- void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
- void destory()
- java.lang.String getServletInfo()
- ServletConfig getServletConfig()
生命周期:
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其 init()方法进行Servlet的初始化;
请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求
对应的doGet或doPost等方法;
当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet 的destroy()方法。
init方法和destory方法只会执行一次,service方法客户端每次请求Servlet都会执行。Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。
如果客户端禁止 cookie 能实现 session 还能用吗?
Cookie 与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。
但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。
假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:
-
手动通过URL传值、隐藏表单传递Session ID。
-
用文件、数据库等形式保存Session ID,在跨页过程中手动调用。
以上是关于计算机网络的主要内容,如果未能解决你的问题,请参考以下文章