剑指Java面试-Offer直通车--计算机网络

前言:以下相关内容多为图片,参考链接、附上少量文字解释,以便整理脉络,以作复习巩固之用。若需详细了解,请进入原博主链接。如有错误,敬请指出,谢谢。

计算机网络

  • 一、网络基础知识讲解
  • 二、Socket
  • 三、TCP三次握手,必考
    • 为何需要三次握手?重要考点
  • 四、TCP四次挥手,必考
    • 为什么需要四次挥手才能断开连接?重要考点
  • 五、TCP和UDP的区别
    • TCP和UDP的区别
  • 六、TCP滑动窗口
  • 七、HTTP简介
    • 客户端请求消息(Request)
    • 服务端响应消息(Response)
    • 考点,在浏览器地址栏键入URL,按下回车之后经历的流程
    • 常见的HTTP状态码,考点
    • GET请求和POST请求的区别,考点
    • Cookie和Session的区别,考点
  • 八、HTTP和HTTPS的区别
    • Https和http区别

参考链接:《剑指Java面试-Offer直通车》–计算机网络

一、网络基础知识讲解

OSI开放式互联参考模型
剑指Java面试-Offer直通车--计算机网络_第1张图片剑指Java面试-Offer直通车--计算机网络_第2张图片
剑指Java面试-Offer直通车--计算机网络_第3张图片 剑指Java面试-Offer直通车--计算机网络_第4张图片

二、Socket

Socket简介
剑指Java面试-Offer直通车--计算机网络_第5张图片
Socket通信流程
剑指Java面试-Offer直通车--计算机网络_第6张图片

三、TCP三次握手,必考

IP数据包、成对端口

传输控制协议TCP简介:

1)面向连接的、可靠的、基于字节流的传输层通信协议

2)将应用层的数据流分割成报文段并发送给目标节点的TCP层

3)数据包都有序号Seq,对方收到则发送ACK确认,未收到则重传

4)使用(奇偶)校验和来检验数据在传输过程中是否有误

下图不是很清晰,但可以看个大概,选择下图关键原因是标出了固定头部20 Bytes以及Offset
剑指Java面试-Offer直通车--计算机网络_第7张图片
参考链接:TCP报文头部
剑指Java面试-Offer直通车--计算机网络_第8张图片三次握手示意图:
剑指Java面试-Offer直通车--计算机网络_第9张图片注意:上面seq=x+1,即之前虽然不携带信息,但会消耗一个序号。

SYN同步序号:
用于建立连接过程,在连接请求中SYN=1和ACK=0表示该数据段没有使用捎带的确认域,连接应答捎带一个确认即SYN=1和ACK=1。

seq序号:
占4字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如:一段报文的序号字段值是107,携带的数据是100个字段,下一个报文段序号从107+100=207开始。

ACK确认序号标志:
为1表示确认号有效,为0表示报文不含确认信息,忽略确认号字段。上面的确认号是否有效就是通过该标识控制的。

为何需要三次握手?重要考点

主要是为了初始化Sequence Number的初始值
通信的双方要互相通知对方 自己的初始化的Sequence Number,也就是上图中的x和y,这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输问题而乱序,即TCP会用这个序号来拼接数据。
因此,在服务器回发它的Sequence Number,即第二次握手之后,客户端还需要发送确认报文给服务器,告知服务器说“客户端已经收到你的初始化的Sequence Number”。

剑指Java面试-Offer直通车--计算机网络_第10张图片剑指Java面试-Offer直通车--计算机网络_第11张图片
剑指Java面试-Offer直通车--计算机网络_第12张图片

四、TCP四次挥手,必考

TCP连接必须经过等待时间2MSL后才真正释放掉
剑指Java面试-Offer直通车--计算机网络_第13张图片注意:第三次挥手,服务器除了携带FIN和seq之外,还携带了ACK和ack,个人认为是对本次客户端申请断开连接的再次确认,可能说法不准确。

FIN终止标志:用于释放连接,为1时表示发送方没有发送了。

为什么会有TIME_WAIT状态?为什么不直接为CLOSE状态?
1、确保有足够的时间让对方收到ACK包(被动关闭的一方没有收到ACK,会触发被动端重发FIN包,一来一回就是2MSL)

2、避免新旧连接混淆(有些路由器会缓存IP数据包,如果连接被重用,延迟收到的包有可能会跟新连接混在一起)

为什么需要四次挥手才能断开连接?重要考点

全双工的意思是允许数据在两个方向上同时传输,
因为TCP是全双工,发送方和接收方都需要FIN报文和ACK报文。即各自需要两次挥手,只不过有一方是被动的。
看上去就成了所谓的四次挥手。

剑指Java面试-Offer直通车--计算机网络_第14张图片

netstat -n | awk ‘/^tcp/ {
     ++S[$NF]} END {
     for(a in S) print a, S[a]}’ 

状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接

ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT表示处理完毕,等待超时结束的请求数。
LAST_ACK:等待所有分组死掉

五、TCP和UDP的区别

UDP报文
剑指Java面试-Offer直通车--计算机网络_第15张图片
特点

1、面向非连接,
2、不维护连接状态,支持同时向多个客户端传输相同的消息
3、数据包报头只有8个字节,额外开销较小
4、吞吐量只受限于数据生成速率、传输速率以及机器性能
5、尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表
6、面向报文,不对应用程序提交的报文信息进行拆分或者合并		-- 即有边界

TCP和UDP的区别

TCP提供可靠的通信传输,UDP常被用于让广播和细节控制交给应用层的通信传输

1、面向连接VS无连接
TCP面向连接,UDP面向无连接。TCP有三次握手的连接过程;UDP适合消息的多播发布,从单个点向多个点传输信息。

2、可靠性
TCP可靠,利用握手确认和重传机制提供可靠性保证;UDP可能丢失,不知道到底有没有接收。

3、有序性
TCP利用序列号保证消息报的顺序交付,到达可能无序,但TCP最终排序;UDP不具备有序性

4、速度
TCP速度慢,因为需要创建连接,保证消息的可靠性、有序性,需要做额外的操作;UDP更适合对速度比较敏感的应用,比如在线视频媒体、电视广播、多人在线游戏。

5、量级
TCP属于中级,UDP属于轻量级。体现在源数据的头大小,TCP是20个字节,UDP是8个字节。

注意:
TCP的固定首部是20字节,但是TCP的首部可能会大些。

六、TCP滑动窗口

参考链接:TCP滑动窗口原理

RTT和RTO

1、RTT:
发送一个数据包到收到对应的ACK,所花费的时间
2、RTO:
重传时间间隔(TCP在发送一个数据包后会启动一个重传定时器。RTO即定时器的重传时间)
开始预先算一个定时器时间,如果回复ACK,重传定时器就自动失效,即不需要重传;如果没有回复ACK,RTO定时器时间就到了,重传。RTO是本次发送当前数据包所预估的超时时间,RTO不是固定写死的配置,是经过RTT计算出来的。基于RTO便有了重传机制。

TCP的滑动窗口:前面TCP报文头有一个Window

发送端/接收端缓冲区与两边的滑动窗口大小,概念上是有区别的。

TCP发送端缓存区四种状态

1、已经发送并且得到端的回应的,即为受到确认ACK
2、已经发送但还没收到端的回应的
3、未发送但对端允许发送的
4、未发送且由于达到window的大小对端不允许发送的。

TCP接受端缓存区四种状态

1.已接收并且已经发送 ACK 回执的数据
2.未接收但可以接收状态 -- 即在滑动窗口内
3.未接收且不能接收的状态 - 达到窗口阈值

注:ACK 直接由 TCP 回复,默认没有应用延迟,不存在已接收未回复 ACK 的状态

七、HTTP简介

超文本传输协议HTTP主要特点

1、支持客户/服务器模式

2、简单快速:客户端向服务器请求服务时只需传送请求方法和路径

3、灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记

4、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
目前的技术如keep-alive使用长连接优化效率,但这些属于HTTP请求之外。

5、无状态

HTTP协议目前处于多个版本共存的情况,包括仍被广泛采用的1.0、主流最为广泛的1.1、应用较少吹的最大的2.0。
1.1较1.0引入了Keep-Alive长连接技术。
2.0更合理更先进但推广不开的原因是1.1完全能够满足目前的应用,并且升级上2.0成本太大。以下以1.1为准。

客户端请求消息(Request)

请求数据:请求正文、数据体。只在post请求中用到,表示要上传的数据。
剑指Java面试-Offer直通车--计算机网络_第16张图片

服务端响应消息(Response)

剑指Java面试-Offer直通车--计算机网络_第17张图片

请求响应的步骤

1)客户端连接到web服务器:
	HTTP客户端通常是浏览器,与web服务器的HTTP端口(默认端口号80)建立TCP套接字连接。

2)发送HTTP请求:
	通过TCP套接字客户端向web服务器发送文本请求报文。

3)服务器接受请求并返回HTTP响应:
	web服务器解析该请求定位请求资源,服务器将资源副本写入TCP套接字,由客户端读取。

4)释放TCP连接
	若连接模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接。
	若连接模式为Keep-Alive,则该连接会保持一段时间,在该时间内可以继续接收请求。

5)客户端浏览器解析HTML内容:
	客户端浏览器首先解析状态行,查看表明请求是否成功的状态码,解析每个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML根据HTML语法对其进行格式化,并在浏览器窗口中显示。

考点,在浏览器地址栏键入URL,按下回车之后经历的流程

忽略掉诸如键盘事件响应之类的,只关心跟网络相关的知识。考虑最简单的流程。

1)DNS解析:
	浏览器会依据URL逐层查询DNS服务器缓存,解析URL中的域名对应的IP地址,DNS缓存从近到远依次是浏览器缓存、系统缓存、路由器缓存、IPS服务器缓存、域名服务器缓存、顶级域名服务器缓存。从哪个缓存找到对应的IP直接返回,不再查询后面的缓存。

2)TCP连接:
	结合三次握手

3)发送HTTP请求:
	浏览器发出读取文件的HTTP请求,该请求发送给服务器

4)服务器处理请求并返回HTTP报文:
	服务器对浏览器请求做出响应,把对应的带有HTML文本的HTTP响应报文发送给浏览器

5)浏览器解析渲染页面

6)连接结束:
	浏览器释放TCP连接,该步骤即四次挥手。
注:第5步和第6步可以认为是同时发生的,哪一步在前没有特别的要求。

常见的HTTP状态码,考点

状态码由3位数字组成,第一位定义响应的类别

1XX:指示信息,表示请求以接收,继续处理

2XX:成功,表示请求已经被成功接收、理解、接受。常见200

3XX:重定向,要完成请求必须进行进一步操作。常见303,304

4XX:客户端错误,请求由语法错误或请求无法实现。常见404,400,403

5XX:服务器错误,服务器未能实现合法的请求。常见500


200 OK:正常返回信息

400 Bad Request:客户端请求有语法错误,不能被服务器所理解。此时需要分析客户端的代码,去看看请求为什么出现服务器无法理解的错误。

401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。表示客户端没有权限去请求某些资源。

403 Forbidden:服务器收到请求但是拒绝提供服务。

404 Not Found:请求资源不存在,检擦URL或路径配置。

500 Internal Server Error:服务器发生不可预测的错误。检查服务器日志,看看里面的代码哪里错误,进而抛出异常。

503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

GET请求和POST请求的区别,考点

1、Http报文层面:GET将请求信息放在URL,POST放在报文体中。
	GET请求信息与URL之间用?隔开,请求信息的格式为键值对。
	POST想获得请求信息必须解析报文。GET中的请求信息放在URL中,长度有限制,浏览器会对URL的长度做出限制。POST请求对数据长度没有限制

2、数据库层面:GET符合幂等性和安全性,POST不符合。
	幂等性:对数据库的一次操作和多次操作获得的结果是一致的。
	安全性:对数据库的操作没有改变数据库中的数据。
	GET操作一般是查询操作,不会改变数据库中原有的数据,大致认为符合安全性和幂等性。
	POST请求既不幂等也不安全,POST请求会往数据库中提交数据,会改变数据库中的数据;
	POST请求每次获得的结果都有可能不一样,因为POST作用在上一级的URL,每一次请求都会添加一份新资源

3、其他层面:GET可以被缓存,被存储,而POST不行。
	GET请求被保存在浏览器的浏览记录中,GET请求的URL能保存为浏览器书签;
	POST方式不具备上述功能,需要别web服务器处理。
	缓存也是GET请求被广泛应用的根本,减少服务器的负担。
	get很多被cdn缓存

Cookie和Session的区别,考点

Cookie简介:
1、是由服务器发送给客户端的特殊信息,以文本的形式存放在客户端。
2、客户端再次请求的时候,会将Cookie回发,即再次发给服务器
3、服务器接手后,会解析Cookie并生成与客户端相对应的内容,如登录

Cookie设置和发送示意图:
剑指Java面试-Offer直通车--计算机网络_第18张图片Session简介:浏览器退出清空相关session,服务器端也删除
1、服务器端的机制,服务器采用类似散列表的结构来保存信息。
2、解析客户端请求,并操作session id,按需保存信息

Session的实现方式主要有两种

1)使用Cookie来实现。
	服务器给每个Session分配一个唯一的JSession id,并通过Cookie发送给客户端。这样势必会在服务器端占用空间
	客户端发起新的请求的时候,将在Cookie头中携带的JSession id,服务器找到客户端对应的Session。

2)使用URL回写来实现。

Tomcat对Session的实现是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写;如果发现Cookie被禁用,就一直使用URL回写。

参考链接:jsessionid的简单说明

Cookie和Session的区别

1)Cookie数据存放在客户的浏览器上,Session数据放在服务器上。

2)Session相对Cookie更安全

3)Session会在一定时间保存在服务器上,考虑到服务器性能的开销,应到使用Cookie

八、HTTP和HTTPS的区别

HTTPS超文本传输安全协议,以计算机网络安全通信为目的的传输协议。
在HTTP协议下加入了SSL层,从而具有了保护交换数据隐私和完整性,提供对网上服务器身份认证的功能。
简单来说就是安全版的HTTP。
SSL安全套接层,为网络通信提供安全及数据完整性的一种安全协议。
位于TCP和各应用层之间,是操作系统对外的API,SSL3.0以后更名为TLS,采用身份验证和数据加密保证网络通信的安全和数据的完整性。

加密的方式(了解):侧重非对称加密

对称加密:加密和解密都使用同一个密钥。

非对称加密:加密使用的密钥和解密使用的密钥是不相同的,分为称为公钥和私钥。公钥算法公开,私钥保密。非对称加密算法性能较低,安全性强,能加密的数据长度有限。区块链很多都用到非对称加密。

哈希算法:将任意长度的信息转换为固定长度的值,算法不可逆。如MD5算法。

数字签名:证明某个信息或者文件是某人发出认同的。签名即在信息的后面加上一段内容,内容经过HashCode值可以证明信息没有被修改过。

HTTPS采用证书配合各种加密手段的方式。

剑指Java面试-Offer直通车--计算机网络_第19张图片

Https和http区别

剑指Java面试-Offer直通车--计算机网络_第20张图片注意:
1、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输身份认证的网络协议
2、因为SSL是有状态的,所以HTTPS有状态

你可能感兴趣的:(剑指Java面试-Offer直通车--计算机网络)