在计算机网络的基本概念中,分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多,在学习时要多思考。这些概念对后面的学习颇有帮助。前端
在计算机网络要作到有条不紊地交换数据,就必须遵照一些事先约定好的规则,好比交换数据的格式、是否须要发送一个应答信息。这些规则被称为网络协议。java
网络协议分层的缺点:功能可能出如今多个层里,产生了额外开销。web
为了使不一样体系结构的计算机网络都能互联,国际标准化组织 ISO 于1977年提出了一个试图使各类计算机在世界范围内互联成网的标准框架,即著名的开放系统互联基本参考模型 OSI/RM,简称为OSI。面试
OSI 的七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用,TCP/IP 体系结构则不一样,但它如今却获得了很是普遍的应用。TCP/IP 是一个四层体系结构,它包含应用层,运输层,网际层和网络接口层(用网际层这个名字是强调这一层是为了解决不一样网络的互连问题),不过从实质上讲,TCP/IP 只有最上面的三层,由于最下面的网络接口层并无什么具体内容,所以在学习计算机网络的原理时每每采用折中的办法,即综合 OSI 和 TCP/IP 的优势,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚,有时为了方便,也可把最底下两层称为网络接口层。数据库
四层协议,五层协议和七层协议的关系以下:segmentfault
注:五层协议的体系结构只是为了介绍网络原理而设计的,实际应用仍是 TCP/IP 四层体系结构。后端
应用层( application-layer )的任务是经过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通讯和交互的规则。浏览器
对于不一样的网络应用须要不一样的应用层协议。在互联网中应用层协议不少,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。安全
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通讯提供通用的数据传输服务。应用进程利用该服务传送应用层报文。服务器
运输层主要使用一下两种协议
每个应用层(TCP/IP参考模型的最高层)协议通常都会使用到两个传输层协议之一:
运行在TCP协议上的协议:
运行在UDP协议上的协议:
运行在TCP和UDP协议上:
网络层的任务就是选择合适的网间路由和交换结点,确保计算机通讯的数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,因为网络层使用 IP 协议,所以分组也叫 IP 数据报 ,简称数据报。
互联网是由大量的异构(heterogeneous)网络经过路由器(router)相互链接起来的。互联网使用的网络层协议是无链接的网际协议(Intert Prococol)和许多路由选择协议,所以互联网的网络层也叫作网际层或 IP 层。
数据链路层(data link layer)一般简称为链路层。两台主机之间的数据传输,老是在一段一段的链路上传送的,这就须要使用专门的链路层的协议。
在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端可以知道一个帧从哪一个比特开始和到哪一个比特结束。
通常的web应用的通讯传输流是这样的:
发送端在层与层之间传输数据时,每通过一层时会被打上一个该层所属的首部信息。反之,接收端在层与层之间传输数据时,每通过一层时会把对应的首部信息去除。
在物理层上所传送的数据单位是比特。 物理层(physical layer)的做用是实现相邻计算机节点之间比特流的透明传送,尽量屏蔽掉具体传输介质和物理设备的差别。使其上面的数据链路层没必要考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来讲,这个电路好像是看不见的。
在互联网使用的各类协议中最重要和最著名的就是 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是一种面向链接的、可靠的、基于字节流的传输层通讯协议,在发送数据前,通讯双方必须在彼此间创建一条链接。所谓的“链接”,实际上是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等。
TCP能够当作是一种字节流,它会处理IP层或如下的层的丢包、重复以及错误问题。在链接的创建过程当中,双方须要交换一些链接的参数。这些参数能够放在TCP头部。
一个TCP链接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP链接一般分为三个阶段:链接、数据传输、退出(关闭)。经过三次握手创建一个连接,经过四次挥手来关闭一个链接。
当一个链接被创建或被终止时,交换的报文段只包含TCP头部,而没有数据。
在了解TCP链接以前先来了解一下TCP报文的头部结构。
上图中有几个字段须要重点介绍下:
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义以下:
须要注意的是:
三次握手的本质是确认通讯双方收发数据的能力
首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了个人发件能力和他的收件能力是能够的。
因而他给我回信,我若收到了,我便知个人发件能力和他的收件能力是能够的,而且他的发件能力和个人收件能力是能够。
然而此时他还不知道他的发件能力和个人收件能力到底可不能够,因而我最后回馈一次,他若收到了,他便清楚了他的发件能力和个人收件能力是能够的。
这,就是三次握手,这样说,你理解了吗?
四次挥手的目的是关闭一个链接
好比客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP链接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。
由于须要考虑链接时丢包的问题,若是只握手2次,第二次握手时若是服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(能够理解服务端已经链接成功)据,而客户端一直没收到服务端的确认报文,因此客户端就不知道服务端是否已经准备好了(能够理解为客户端未链接成功),这种状况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。
若是是三次握手,即使发生丢包也不会有问题,好比若是第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会从新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。
由于只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(因此不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。
这里一样是要考虑丢包的问题,若是第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,因此须要等这么长时间来确认服务端确实已经收到了。
TCP设有一个保活计时器,客户端若是出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会从新复位这个计时器,时间一般是设置为2小时,若两小时尚未收到客户端的任何数据,服务器就会发送一个探测报文段,之后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭链接。
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
HTTP状态码表示客户端HTTP请求的返回结果、标识服务器处理是否正常、代表请求出现的错误等。
状态码的类别:
说道GET和POST,就不得不提HTTP协议,由于浏览器和服务器的交互是经过HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法。
HTTP全称为Hyper Text Transfer Protocol,中文翻译为超文本传输协议,目的是保证浏览器与服务器之间的通讯。HTTP的工做方式是客户端与服务器之间的请求-应答协议。
HTTP协议中定义了浏览器和服务器进行交互的不一样方法,基本方法有4种,分别是GET,POST,PUT,DELETE。这四种方法能够理解为,对服务器资源的查,改,增,删。
GET和POST区别
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;
而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥能够随意发布,但私钥只有本身知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用本身的私钥进行解密。
因为非对称加密的方式不须要发送用来解密的私钥,因此能够保证安全性;可是和对称加密比起来,很是的慢
HTTP2 能够提升了网页的性能。
在 HTTP1 中浏览器限制了同一个域名下的请求数量(Chrome 下通常是六个),当在请求不少资源的时候,因为队头阻塞当浏览器达到最大请求数量时,剩余的资源需等待当前的六个请求完成后才能发起请求。
HTTP2 中引入了多路复用的技术,这个技术能够只经过一个 TCP 链接就能够传输全部的请求数据。多路复用能够绕过浏览器限制同一个域名下的请求数量的问题,进而提升了网页的性能。
Session、Cookie和Token的主要区别
HTTP协议自己是无状态的。什么是无状态呢,即服务器没法判断用户身份。
cookie是由Web服务器保存在用户浏览器上的小文件(key-value格式),包含用户相关的信息。客户端向服务器发起请求,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户身份。
session是依赖Cookie实现的。session是服务器端对象
session 是浏览器和服务器会话过程当中,服务器分配的一块储存空间。服务器默认为浏览器在cookie中设置 sessionid,浏览器在向服务器请求过程当中传输 cookie 包含 sessionid ,服务器根据 sessionid 获取出会话中存储的信息,而后肯定会话的身份信息。
cookie与session区别
Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并做出相应提示,在这样的背景下,Token便应运而生。
Token的定义:Token是服务端生成的一串字符串,以做客户端进行请求的一个令牌,当第一次登陆后,服务器生成一个Token便将此Token返回给客户端,之后客户端只需带上这个Token前来请求数据便可,无需再次带上用户名和密码。
使用Token的目的:Token的目的是为了减轻服务器的压力,减小频繁的查询数据库,使服务器更加健壮。
Token 是在服务端产生的。若是前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端能够在每次请求的时候带上 Token 证实本身的合法地位
session与token区别
Servlet不是线程安全的,多线程并发的读写会致使数据不一样步的问题。
解决的办法是尽可能不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语句块能够解决问题,可是会形成线程的等待,不是很科学的办法。
注意:多线程的并发的读写Servlet类属性会致使数据不一样步。可是若是只是并发地读取属性而不写入,则不存在数据不一样步的问题。所以Servlet里的只读属性最好定义为final类型的。
在Java Web程序中,Servlet主要负责接收用户请求HttpServletRequest,在doGet(),doPost()中作相应的处理,并将回应HttpServletResponse反馈给用户。Servlet能够设置初始化参数,供Servlet内部使用。
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;
请求到达时调用Servlet的service()方法,service()方法会根据须要调用与请求对应的doGet或doPost等方法;
当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
init方法和destory方法只会执行一次,service方法客户端每次请求Servlet都会执行。Servlet中有时会用到一些须要初始化与销毁的资源,所以能够把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不须要每次处理客户端的请求都要初始化与销毁资源。
Cookie 与 Session,通常认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。
但为何禁用Cookie就不能获得Session呢?由于Session是用Session ID来肯定当前对话所对应的服务器Session,而Session ID是经过Cookie来传递的,禁用Cookie至关于失去了Session ID,也就得不到Session了。
假定用户关闭Cookie的状况下使用Session,其实现途径有如下几种: