Java面试经验个人总结(四)——计算机网络

计算机网络

一、OSI七层协议

1. 物理层:原始比特流的传输;

2. 数据链路层:物理寻址,同时将原始比特流变为逻辑传输线路,比特数据转为帧,交换机工作在这一层;

3. 网络层:将网路地址翻译为物理地址;路由器,IP协议在网络层

4. 传输层:TCP/UDP传输协议,流量控制;

5. 会话层:建立和管理应用程序之间的通信

6. 表示层:加密解密,转换翻译,压缩&解压;

7. 应用层:HTTP协议

 

二、ARP协议

1. ARP:地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

2. 地址解析原理

(1)主机需要在自己的ARP缓冲区建立一个ARP列表,表示IP地址与MAC地址之间映射;

(2)当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址;

(3)当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址;

(4)源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。广播发送ARP请求,单播发送ARP响应。                                                                                                                                                                                                                                                                                                                   

三、TCP/IP

1. 链路层

2. 网络层

3. 传输层

4. 应用层

 

 

四、TCP的三次握手

1. 传输控制协议TCP

(1)面向连接的,可靠的(IP协议不可靠),基于字节流的传输层通信协议;

(2)将应用层的数据流分割成报文段并发送给目标节点的TCP层,报文段的长度受该计算机网路连接的数据链路层的最大传输单元(MTU);

(3)数据包都有序号,对方收到则发送ACK确认,在RTT(往返时延)内未收到则重传;

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

2. TCP 协议如何来保证传输的可靠性

(1)数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;

(2)对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;

(3)丢弃重复数据:对于重复数据,能够丢弃重复数据;

(4)应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;

(5)超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

(6)流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。

3. 字节就是散乱的数据(链路层),报文(传输层阶段)就是添加了标记,封装后的数据。

4. TCP报文头

(1)Source port:原端口,占2字节;

(2)Destination port:目的端口,占2字节;

(3)Sequence number:序号,占4字节;

(4)Acknowledgment number:确认号,占4字节,是期望收到对方下一个报文的第一个字节的序号;

(5)Offset:数据偏移,有头部有可选字段,它指出tcp数据距离tcp报文起始处有多远;

(6)Reserved:保留域;

(7)TCP flags:控制位

①URG:紧急指针标志

②ACK:确认序号标志;

③PSH:push标值;

④RST:重连标志;

⑤SYN:同步序号,用于建立连接过程

⑥FIN:finish标志,用于释放连接

(8)window:滑动窗口大小,用来告知发送端接收端的缓存大小,控制发送速率;

(9)Checksum:校验和

(10)Urgent pointer:紧急指针

(11)TCP options:TCP可选端

5. 当应用程序希望通过TCP与另一个程序通信时,它会发送一个通信请求,这个请求必须要被发送到确切地址,在双方“握手”后,TCP将在两个应用之间建立全双工通信,将占用 两个计算机的通信线路。

6. TCP三次握手流程

 

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认;

(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态;

(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

7. 为什么TCP需要三次握手?

(1)“三次握手” 的目的是为了防止已失效的链接请求报文突然又传送到了服务端,因而产生错误。

(2)为了初始化SequenceNumber的初始值;

(3)假设不采用“三次握手”,那么只要 B 发出确认,新的连接就建立了。由于现在 A 并没有发出建立连接的请求,因此不会理睬 B 的确认,也不会向 B 发送数据。但 B 却以为新的运输连接已经建立,并一直等待 A 发来数据。这样,B 的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。

8. 2次握手的隐患——SYN超时

(1)原因:Server收到Client的SYN,回复SYN-ACK包的时候未收到Client的ACK确认;

(2)Server端没有收到Client端的ACK(即第三次握手),会不断重试直至超时,Linux默认等待63秒(1+2+4+8+16+32)才断开连接;

(3)SYN Flood:是一种广为人知的DoS(拒绝服务攻击)是DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。即2次握手之后,Client掉线,不发送ACK到Server端。

9. SYN Flood防护措施

(1)SYN队列满后,通过tcp_syncookies参数回发SYN Cookie;

(2)若为正常连接则Client会回发SYN Cookie,直接建立连接;

10. 建立连接后,Client出现故障怎么办?

保活机制

(1)向对方发送保活探测报文,如果未收到响应则继续发送;

(2)尝试次数达到保活探测数仍未收到响应则中断连接;

 

五、TCP的四次挥手

1. TCP四次挥手流程

 

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态;

(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收;

(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态;

(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态(此时Client并没有close,二是等待2*MSL时间后才进入close状态),接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。(MSL-最大报文生存时间)

2. 为什么会有TIME_WAIT?

(1)确保有足够的时间让对方收到ACK包;

(2)避免新旧连接混淆;

3. 为什么要四次挥手才能断开连接?

因为TCP是全双工的,发送方和接受方都需要FIN报文和ACK报文;

4. 服务器出现大量CLOSE_WAIT状态的原因。

(1)对方关闭socket连接,我方忙于读写,没有及时关闭连接;

(2)解决方法:检查代码,特别是释放资源的代码;

 

六、TCP与UDP的区别

1. UDP报文结构

Source Port

Destination Port

Length

Checksum

Data octets...(optional)

(1)Source port:原端口,占16字节;

(2)Destination port:目的端口,占16字节;

(3)Length:数据包长度

(4)Checksum:奇偶校验值

(5)Data octets...:用户数据

2. UDP特点

(1)面向非连接:UDP是非连接的协议,传输数据之前,源端和终端无连接建立,但想传送时,就简单抓取数据,然后快速扔到网络上,UDP的速度受计算机能力,带宽的限制;

(2)不维护连接状态,支持同时向多个Client传输相同的消息;

(3)数据包报头只有8个字节,额外开销小;

(4)吞吐量只受限于数据生成速率、传输速率以及机器性能;

(5)尽最大努力交付,不保证可靠交付,不需要维持复杂的连接状态表;

(6)面向报文,不对应用程序提交的报文信息进行拆分或者合并;

3. UDP和TCP区别

(1)TCP是面向连接的,UDP是无连接的;

(2)TCP 可靠,UDP不可靠;

(3)TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;

(4)TCP是面向字节流的,UDP是面向报文的;

(5)TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;

(6)TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;

 

七、TCP滑窗

1. RTT和RTO

(1)RTT:Round TripTime往返时间   发送一个数据包到收到对应的ACK,所花费的时间;

(2)RTO:Retransmission TimeOut重传超时时间  

2. TCP使用滑动窗口做流量控制与乱序重排,保证了TCP的可靠性和流控特性;

3. 滑动窗口机制

由发送方和接收方在三次握手阶段,互相将自己的最大可接收的数据量告诉对方。也就是自己的数据接收缓冲池的大小。这样对方可以根据已发送的数据量来计算是否可以接着发送。在处理过程中,当接收缓冲池的大小发生变化时,要给对方发送更新窗口大小的通知。这就实现了流量的控制。

4. 窗口数据的计算过程

(1)接收方可接受窗口的大小:

AdvertisedWindow = MaxRcvBuffer(接收方最大接受数据量) - (LastByteRcvd-LastByteRead)(预留空间)

(2)发送方窗口内剩余可发送大小:

EffectiveWindow = AdvertisedWindow-(LastByteSent-LastByteAcked)

 

5. TCP发送缓存区数据状态

(1)已发送并收到端的回应;

(2)已发送但未收到端的回应;

(3)未发送但对端允许发送;

(4)未发送,但由于达到了window的大小,对端不可发送

 

6. TCP接受缓存区数据状态

(1)已接收并发出回执;

(2)未接收,但准备接收;

(3)未接收且不能接收

 

 

八、 HTTP

1. HTTP主要特点

(1)支持Client/Server模式;

(2)简单快速;

(3)灵活;

(4)无连接;

(5)无状态

2. 浏览器建立连接流程

(1)由域名→IP地址 寻找IP地址的过程(DNS解析)依次经过了浏览器缓存、系统缓存、hosts文件、路由器缓存、 递归搜索根域名服务器。 (Hosts是一个没有扩展名的系统文件,本质就是<网址域名,IP地址>的“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。Hosts文件配置的映射是静态的,如果网络上的计算机更改了请及时更新IP地址,否则将不能访问。)

(2)建立TCP/IP连接(三次握手具体过程)

(3)由浏览器发送一个HTTP请求

(4)经过路由器的转发,通过服务器的防火墙,该HTTP请求到达了服务器

(5)服务器处理该HTTP请求,返回一个HTML文件

(6)释放TCP连接

(7)浏览器解析该HTML文件,并且显示在浏览器端

(8)注意:

①:HTTP协议是一种基于TCP/IP的应用层协议,进行HTTP数据请求必须先建立TCP/IP连接;

②:可以这样理解:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

③:两个计算机之间的交流无非是两个端口之间的数据通信,具体的数据会以什么样的形式展现是以不同的应用层协议来定义的

3. HTTP状态码

(1)1xx(临时响应)

(2)2xx(成功)

(3)3xx(重定向):表示要完成请求需要进一步操作

(4)4xx(客户端错误):表示请求可能出错,妨碍了服务器的处理

(5)5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误

(6)常见的HTTP状态码

a. 200(OK):服务器成功执行了客户端所请求的动作;

b. 201(Created):服务器依照客户端的请求创建了一个新资源;

c. 204(No Content):服务器拒绝对PUT、POST或者DELETE请求返回任何状态信息或表示;

d. 304(Not Modified):自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容;

e. 307(Temporary Redirect):请求还没有被处理,因为所请求的资源不在本地:它在另一个URI处。客户端应该向那个URI重新发送请求。

f. 401(Unauthorized):客户端试图对一个受保护的资源进行操作,却又没有提供正确的认证证书;

g. 403(Forbidden):服务器拒绝请求;

h. 404(Not Found):服务器找不到请求的网页。

i. 409(Conflict):请求的操作会导致服务器的资源处于一种不可能或不一致的状态,资源冲突;

j. 500(Internal Server Error):通用的服务器错误响应

k. 503(Service Unavailable):服务器不可用

4. Get和Post的区别

(1)http报文层面:get将请求信息放在URL中,post放在报文体中,相比较而言,post更加安全;

(2)数据库层面:get符合幂等性(读取同一个资源,总是得到相同的数据)和安全性(对数据库的操作没有改变数据库的数据),而post不符合;

(3)功能层面:GET一般用来从服务器上获取资源,POST一般用来更新服务器上的资源;

(4)其他层面:get可以被缓存、存储,而post不行

5. Cookie

(1)cookie:是由服务器发给客户端的特殊信息,以文本的形式存放在客户端,比如自动记住密码;cookie的内容主要包括:名字,值,过期时间,路径和域。

(2)客户端再次请求时,会把cookie回发;

(3)服务器接收到后,会解析cookie生成与客户端相对应的内容;

(4)Cookie设置以及发送过程

 

6. Session

(1)服务器端的机制,在服务器上使用类似散列表的形式保存信息;session默认保存在内存中,但是支持持久化以保存到硬盘中;

(2)Session与cookie的创建过程:

a. 客户端向服务端请求生成session,服务端首先检查请求中是否包含sessionID,即在请求头部中没有类似Cookie: JSESSIONID=XX的内容,并由某种算法产生一个值赋给这个Session的id,并将SessionId,和Session对象放入HashMap中,然后将这个SessionId发回以客户端,即在响应的头部有一行:Set-Cookie:JSESSIONID=XX,浏览器解析后会将在JSESSIONID和值记录到Cookie中;

b. 当用浏览器再次请求此网站的另一页面时,浏览器检查看有没有Cookie,这时有Cookie(前提是Cookie没有过期),会自动的把Cookie的内容附加到请求头中,即在请求头附加了一行:Cookie: JSESSIONID=XX,服务器接收到请求后会根据JSESSIONID的值知道SessionId的值,在tomcat中两个值是一样的,然后你可根据这个SessionId找到对应的Session,可由Session中登录后设定的某些值是否为空,来判断此用户是否登录。

                        

c. 用户安全登出后(调用session.invalidate()),服务器会将Session销毁,并生成一个新的JSESSIONID发回用客户端,浏览器接收响应后,会将Cookie中的JSESSIONID换成新值,当用户再次访问此服务器时,会在请求中自动的加入新的JSESSIONID的值发到服务器,这时服务器根据JSESSIONID找不对应的Session了,因此就可知道是一次新的会话,服务器会生成一个Session对象,并将客户端发过来的JSESSION的值赋给这个Session的id。

(3)Session的实现方式:使用cookie实现;使用URL回写来实现。

(4)分布式事务的共享

a. Session Replication:将一台机器上的Session数据广播复制到集群中其余机器上;

b. Session Sticky:粘性Session、当用户访问集群中某台机器后,强制指定后续所有请求均落到此机器上;

c. 缓存集中式:将Session存入分布式缓存集群中的某台机器上,当用户访问不同节点时先从缓存中拿Session信息。

(5)Session的存储方式

a. 保存在内存中,但会断电丢失

b. 保存在StateServer,重启时保存会话状态;

c. 保存在SQL server上,在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库

7. Cookie与Session的区别

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

(2)Session相对Cookie更安全;

(3)Cookie保存在浏览器上,因此可以减轻服务器的开销;

8. HTTP请求报文和响应报文

(1)请求报文:

a. 请求行:URL+请求方法(GET,POST)+协议版本;

b. 请求头部:字符集,hosts,cookie等。在请求头中还可以定义数据交互格式,比如以JSON或者XML格式进行交互。

c. 请求体:content,content类型和长度信息

 

(2)响应报文

a. 状态行:协议版本+状态码+状态码描述

b. 响应头部:location,连接方式等

c. 响应体:文本信息。

9. HTTP和HTTPS

(1)HTTPS结构

 

(2) SSL(Security Sockets Layer)安全套接层

a. 为网络通信提供安全及数据完整性的一种安全协议;

b. 是操作系统对外的API,SSL3.0后更名为TLS;

c. 采用身份验证和数据加密保证网络通信的安全和数据完整性;

(3)加密方式

a. 对称加密:加密和解密都是用同一个密钥;

b. 非对称加密:加密使用的密钥和解密使用的密钥不同,比如区块链技术;

c. Hash算法:将任意长度的信息转换为固定长度的值,算法不可逆,比如MD5加密;

d. 数字签名:证明某个消息或者文件是某人发出的或者认同的

(4)HTTPS数据传输流程

a. 浏览器将支持的加密算法信息发送给服务器;

b. 服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器;

c. 浏览器验证证书的合法性,并结合证书公钥加密信息发送给服务器;

d. 服务器使用私钥解密信息,验证hash,加密响应消息回发浏览器;

e. 浏览器解密响应消息,并对消息进行验证,之后进行加密交互数据;

(5)HTTP,HTTP2.0和HTTPS的不同

a. HTTPS需要到Certificate Authority(证书颁发机构)申请证书,HTTP不要;

b. HTTPS密文传输,HTTP明文传输;

c. HTTPS默认443端口,HTTP则是80;

d. HTTPS=HTTP+加密+认证+完整性保护,HTTPS通信会由于加减密处理消耗更多的CPU和内存资源,但是会更加安全;

e. http2.0是基于2进制的,采用多路复用,请求头压缩,还有服务端推送功能。

(6)HTTPS弊端

a. 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险;

b. 可以使用HSTS优化;

(7)XSS 攻击

XSS是一种经常出现在web应用中的计算机安全漏洞,与SQL注入一起成为web中最主流的攻击方式。XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

 

九、Socket

1. Socket

Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,从而实现进程在网络中通信。

 

2. Socket编程api

(1)socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个Socket。

int socket(int domain, int type, int protocol);

a. domain:即协议域,又称为协议族;AF_INET或者AF_UNIX

b. type:指定socket类型;流(stream)和数据报(datagram)

c. protocol:协议;TCP,UDP等

(2)bind()函数把一个地址族中的特定地址赋给socket;

(3)调用listen()来监听socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求;

(4)accept()函数接收请求,之后就可以网络I/O请求了;

(5)connect()函数来向服务器端发送请求

(6)read()、write()等函数;

(7)close()关闭相应的socket描述字;

3. Socket通信流程

 

 

十、页面跳转

1. 转发和重定向区别

(1)转发使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect();     

(2)转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;       

(3)转发是服务器行为,重定向是客户端行为;       

(4)转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;       

(5)转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)。

 

十一、长连接和短链接

1. 长连接和短连接

(1)长连接:指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。如果TCP连接在2小时内没有任何动作,则服务器开始想客户端发送探测报文。

(2)短连接:短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段);

2. 应用场景

长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况,。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。       

而像WEB网站的http服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的长连接),因为长连接对于服务端来说会耗费一定的资源。所以并发量大,但每个用户无需频繁操作情况下需用短连好。          

在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值