计算机网络及JavaWeb
1)“四层/五层/七层”网络模型
各层作用:
物理层:
在物理媒介上进行传输数据,常用设备:网卡。
数据链路层:
提供介质访问和链路管理(MAC地址),常用设备:网桥、交换机。
网络层:
IP选址及路由选择,主要核心就是路由器的功能,例如路由(规划路线)、存储(缓存接收包)、转发、拥塞控制等。
传输层:
传输单位是段,负责向两个主机中进程之间的通信提供服务,传输层的数据单元为数据包,TCP的数据单元称为段,而UDP协议的数据单元称为“数据报”。传输层主要使用两种协议:传输控制协议TCP(面向连接的,可靠的交付)、用户数据报协议UDP(无连接的、尽最大努力的交付)。
会话层:
不参与具体的传输,用于创建和管理会话。
表示层:
主要解决信息的语法表示问题。
应用层:
为操作系统或网络应用程序提供访问网络服务的接口。应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。
2)分层的作用
作用:有助于简化网络,方便网络的设计、建设和研究。
3)路由器与交互机的区别
(1)工作层次不同:交换机工作在数据链路层,路由器工作在网络层。
(2)数据的转发对象不同:交换机是根据MAC地址转发数据帧,路由器则是根据IP地址来转发IP数据报/分组。
(3)功能不同:交换机主要用于局域网内的数据转发,路由器主要负责让主机连接局域网和外网。
4) TCP/UDP的对比与适合的场景
5) TCP三次握手,四次挥手
"三次握手":
作用:用于建立客户端和服务端之间的连接。
第一次握手:
客户端发起建立连接,会发送SYN包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认。
第二次握手:
服务器收到SYN包,确认客户端的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,服务器进入SYN_RECV状态。(此时说明客户端的发送能力和服务器的接收能力没问题,但是不确定客户端的接收能力和服务器的发送能力,因此要进行第三次握手)
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(连接成功)状态,完成三次握手。(该握手保证了客户端的接收能力和服务器的发送能力没问题)
"四次挥手":
作用:用于释放客户端和服务器之间的连接。
第一次挥手:
客户端发出连接释放报文,并且停止发送,释放数据报文首部,FIN=1,seq=u,此时,客户端进入FIN-WAIT-1(终止等待1)状态。
第二次挥手:
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,携带自己的序列号seq=v,此时,服务器进入了CLOSE-WAIT(关闭等待)状态(TCP服务器会通知应用进程,这时客户端向服务器的方向就释放了,该状态会持续一段时间,因为服务器若发送数据,客户端依然要接收),客户端收到服务器的确认请求后,此时,客户端进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文。(在这之前还需要接收服 务器发送的最后的数据)。
第三次挥手:
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于此时处于半关闭状态,服务器可能又发送了一些数据,假定此时的seq=w,此时,服务器就进入LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手:
客户端收到服务器的连接释放报文,发出确认,ACK=1,ack=w+1,而自己的序列号seq=u+1,此时,客户端进入TIME-WAIT(时间等待)状态,(注意此时TCP连接并没有释放,必须经过2MSL(最大报文段生存时间)才能返回到CLOSE状态,因为网络不可靠,有可能最后一个ACK丢失,若在2MSL 里面没有再次收到服务器的FIN,说明ACK被服务器接收了,则结束TCP连接)
6) TCP的流量控制与拥塞控制分别是做什么的?
流量控制:
问题:
双方在通信时,当发送方与接收方的速率不一致时,接收方会将未处理的数据存放在缓冲区,如果缓冲区满了,而发送方仍然在发送大量的数据,接收方就会从缓冲区中丢掉数据,导致浪费大量的网络资源。
目的:为了防止接受方的缓冲区大小不够发生溢出,所以减小接收窗口。
方式:使用滑动窗口协议,即接收方在TCP报文的窗口字段限制发送方的发送速率。(是点对点的通信量控制)
拥塞控制:
问题:当发送方发送大量的数据会注入到网络,如果没有限制,网络就会就会超负荷变卡。
目的:防止过多的数据注入网络,造成网络中的路由器过载。
方式:发送方自己检测网络的状态,如遇到超时、重复确认包时,对拥塞窗口进行调整。拥塞控制的有四种算法:慢开始、拥塞避免、快重传、快恢复。
7) 什么是滑动窗口协议
滑动窗口协议:
发送方和接收方各有一个缓存数组,发送方存放着:已发送且成功确认包序号、已发送未确认包序号 ,未发送包序号。接收方存放着:已接受包序号、正在接收包序号、未接收包序号。每个数组有个两个扫描指针,开头和结尾,一起向后扫描,两者形成一个窗口,所以被称为窗口协议
主要有两类协议:
GBN(回退N重传协议):
GBN协议的确认是累积确认,例如,窗口大小为4,则传输0,1,2,3四个数据包,若发送方收到0,1的确认包,则继续发送4,5的数据包,若此时超时未收到2的数据包,则会重新发送2,3,4,5的数据包
SR(选择重传协议):
设置缓存机制,例如,窗口大小为4,发送0,1,2,3,当发送方收到0,1的确认包,就继续发送4,5的数据包,接收方此时会缓存4,5的数据包,当发送方接收2的确认包时间超过规定时间,就只需要重新发送2的数据包,不需要重新发送4,5的数据包
8)拥塞控制四种算法
1、慢开始
将拥塞窗口(cwnd)的值设为1,发送方先发送一个数据报文段,接收方收到后发送一个确认报文段,发送方接收到确认报文段后,拥塞窗口的值加倍增大变为2(该过程就是一个RTT)。经过多个RTT后,拥塞窗口的大小变为16,达到慢开始的限值,之后改用拥塞避免算法。
2、拥塞避免
超时重传机制:
在发送一个数据之后,就开启一个计时器,若是在这个时间内没有ACK确认报文,则对这个数据报文段进行重传,当达到一定次数后还没有成功,就会放弃并发送一个复位信号。
过程:
开启拥塞避免之后,拥塞窗口(cwnd)的值每次只能线性加1,就像(16+1.....24)直到24,假设24个报文段在传输过程中丢失了4个,接收方只收到20个报文段,就只能给发送方回复20个确认报文段,一段时间后,丢失的4个报文的重传计时器超时,发送方就判断可能出现拥塞,就更改cwnd和ssthresh,并重新开始慢开始算法。
3、快重传
发送方先发送1号报文段,在接收方回复1号确认报文段的时候,发送方可以继续发送2号报文段,发送方发送到3号报文段时,发生丢失,此时接收方未收到3号报文段,因此向发送方重复发送2号确认报文段,发送方收到2号确认报文段后继续发送4号,5号报文段,接收方没有收到3号报文段,故重复发送了三次2号确认报文段,这时发送方收到了三次2号确认报文段,判断3号报文段丢失,就立即重传3号报文段,接收方收到3号报文段后,就会把最后一个5号确认报文段回复给发送方,表明序号到5为止的报文段都收到了。
4、快恢复
发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段,于是不开启慢开始算法,而执行快恢复算法:
· 发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半,开始执行拥塞避免算法
· 或者将快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh+3。
9)HTTP请求报文与响应报文的组成部分
请求报文组成部分:
请求行:请求方法、URL、以及协议版本 例如:POST /search?source=baidu HTTP/1.1
· 其中常见的请求方法有:GET、POST、PUT、DELETE
请求头:为请求报文添加一些信息,由"名/值"对组成,每行一对,名和值之间使用冒号隔开
例如:Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel
Accept-Language: zh-cn
空行:最后一个请求头之后是一个空行,通知服务器以下不会再有请求头
请求数据:请求体(在POST、PUT方法中支持传递请求体,GET、HEAD不支持)例如:{"name":"zhangsan","sex":"man"}
响应报文组成部分:
状态行:由HTTP协议的版本、响应状态代码、状态代码的文本描述三部分组成,例如:HTTP/1.1 200 OK
响应头:描述服务器的基本信息,以及数据的描述
响应正文:传递的数据
10)常见的HTTP响应状态码
1xx——信息类:表示收到http请求,正在进行下一步处理。
2xx——成功类:表示用户请求被正确接收、理解和处理。
· 200(OK):请求成功
· 201(Created):已创建
3xx——重定向类:表示没有请求成功,必须采取进一步的动作。
· 301 (Moved Permanently):资源被永久移动
· 302 (Found):资源临时移动
4xx——客户端错误:表示客户端提交的请求包含语法错误或不能正确执行
· 400 (Bad Request):客户端请求地址不存在或者包含不支持的参数
· 401 (Unauthorized):未授权,或认证失败。对于需要登录的网页,服务器可能返回此响应状态码
· 403 (Forbidden):没权限,服务器收到请求,但拒绝提供服务
· 404 (Not Found):请求的资源不存在。例如请求的url错误
5xx——服务端错误:表示服务器不能正确执行一个正确的请求
11)GET与POST的区别
POST更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)
POST发送的数据更大(GET有url长度限制,这里的限制是指浏览器对url长度的限制,不是HTTP协议对url长度的限制)
POST能发送更多的数据类型(GET只能发送ASCII字符)
POST比GET慢(因为GET会把Header和Data一并发送出去,服务器响应200,ok;POST先发送Header先响应100,continue,再发送Data,响应200,ok)
POST可以通过URL传值和请求体传值,GET只能通过URL传值
12)session是如何实现的
session,也叫会话,一个浏览器窗口从打开到关闭可以叫一次会话。
常用的实现方式为Cookie实现:客户端浏览器请求服务器,如果服务器需要记录该用户的状态,就会用response向客户端浏览器发送一个Cookie,浏览器会把这个Cookie保存起来,当再次请求服务器的时候,就会把这个Cookie也提交给服务器,服务器就会检查这个Cookie,以此来辨认用户状态。(注意:Cookie不能跨域)
13)session与cookie的区别
session数据保存在服务端,cookie数据保存在客户端。
cookie是session的一种实现方式,session还有其他实现方式。
cookie安全性低(可能遇到CSRF攻击),session安全性高。
14)HTTP 1.1/2.0 做了哪些改进
1、2.0采用了二进制格式解析
2、2.0是完全多路复用,而非有序阻塞,即只需要一个连接即可实现并行
3、压缩了Header,减少了Header(例如,每次不会改变的UserAgent、Cookie等,第一次请求时,会发送全部Header,后面再次请求,就会减少冗余数据)
4、服务器主动推送响应到客户端缓存中
15)Servlet的生命周期
四个阶段:
加载和实例化阶段:由servlet容器负责,可以发生在容器启动时,也可以发生在有请求需要处理时。
初始化阶段:调用init()方法,只运行一次。
响应客户请求阶段:调用service(()方法,根据请求方法,分别执行doGET(),doPOST()等抽象方法。
终止阶段:调用destroy()方法,只运行一次。
注意:servlet线程不安全
16)servlet与tomcat的关系
servlet:处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,由容器托管,用于生成动态内容。
servlet容器:是web容器的一部分,提供基于请求/响应发送模型的网络服务
web容器:也叫web server,提供web服务的软件程序
关系:
tomcat即是Web容器,也是Servlet容器,
tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.
Servlet是一种运行在支持Java语言的服务器上的组件,并且不能单独运行,必须运行在servlet容器内,且servlet容器需要配合web容器
从HTTP协议的请求和响应可知,浏览器发出的请求是一个请求文本,接收的也是一个响应文本,其中的过程实现:
当浏览器发送一个HTTP请求到web服务器后,web服务器会接收请求并且交给servlet容器处理,
servlet容器根据servle配置选择相应的servlet,并使用代表请求和响应对象的参数进行调用。
servlet通过请求对象得到请求头、请求行、请求体参数。servlet就执行编写的逻辑,然后动态产生响应内容发送回客户端
servlet完成请求的处理后,将控制权还给web服务器。
17)为什么tomcat既是web容器又是servlet容器
因为启动tomcat后,它会读取server.xml配置文件,启动配置的web应用,当从浏览器发送一个HTTP请求,tomcat作为web容器就会接收这个请求及对应的参数,为每个应用创建了一个servletContext对象,这个servletContext对象是由servlet容器生成,用来处理请求和响应结果给浏览器,所以tomcat既是一个servlet容器也是一个web容器