主题
计算机网络面试题
1.http和https的区别
1、原理不同
http协议运行于TCP之上,明文传输,客户端和服务端都无法验证对方身份
https是身披SSL(Secure Socket Layer)外壳的http,运行于SSL之上,是添加了加密和认证机制的http
2、端口不同
http使用的是80端口,https使用的是443端口
3、资源消耗不同
和http通信相比,https会由于加密解密出来消耗更多的cpu资源和内存
4、开销
https通信需要证书,证书需要向认证机构购买
http的加密机制是一种共享密钥加密和公开公钥加密并用的混合加密机制
2.对称加密和非对称加密
1、加密算法不同:
在非对称性加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
在对称加密中使用的主要算法有:DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)、Blowfish等。
2、加密安全性不同:
对称性加密的通信双方使用相同的密钥,如果一方的密钥遭到泄露,那么整个通信就会被破解。
而非对称加密使用一对密钥,一个用来加密,一个用来解密,而且公钥是公开的,密钥是自己保存的,不需要像对称加密那样在通信之前先要同步密钥。非对称家吗其安全性更好。
3、流程不同:
非对称加密流程:

对称加密流程:

4、加密耗时不同:
非对称加密使用一对密钥,一个用来加密,一个用来解密,这样加密个解密花费的时间就会更长。
对称加密中加密方和解密方使用同一个密钥,加密解密的速度比较快,耗时短,适合数据比较长时间使用。
3.三次握手与四次挥手的流程
3.1三次握手

解释如下:
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为x+1,标志位ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
3.2四次挥手 
解释如下:
第一次挥手
TCP发送一个FIN(结束),用来关闭客户到服务端的连接。
客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),
此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
第二次挥手
服务端收到这个FIN,他发回一个**ACK(确认),**确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。
TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。
这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
第三次挥手
服务端发送一个**FIN(结束)**到客户端,服务端关闭客户端的连接。
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据
假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手
客户端发送**ACK(确认)**报文确认,并将确认的序号+1,这样关闭完成。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。
注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
4.为什么TCP需要三次握手,两次不可以吗?为什么
两次不行。TCP进行可靠传输的关键就在于维护一个序列号,三次握手的过程即是通信双方相互告知序列号起始值,并确认双方已经收到了序列号起始值。如果只是两次握手,至多只有客户端的起始序列号能被确认,服务器端的序列号则得不到确认。
5.为什么TCP挥手需要四次?三次不行吗?
为了确保数据能够完成传输。
关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了。
所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
可能有人会有疑问,tcp我握手的时候为何ACK(确认)和SYN(建立连接)是一起发送。挥手的时候为什么是分开的时候发送呢?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步挥手。
6.TCP协议如何来保证传输的可靠性?
7.客户端不断进行请求连接会怎么样?DDOS攻击?
8.get和post的区别
- GET 请求的数据会附在 URL 之后(就是把数据放置在 HTTP 协议头中),以?分割 URL 和传输数据,参数之间 以&相连,如:login.action?name=zhagnsan&password=123456。POST 把提交的数据则放置在是 HTTP 包的包 体中。
- GET 方式提交的数据最多只能是 1024 字节,理论上 POST 没有限制,可传较大量的数据。其实这样说是错误
的,不准确的:
“GET 方式提交的数据最多只能是 1024 字节",因为 GET 是通过 URL 提交数据,那么 GET 可提交的数据量就跟
URL 的长度有直接关系了。而实际上,URL 不存在参数上限的问题,HTTP 协议规范没有对 URL 长度进行限制。这个 限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、 FireFox 等,理论上没有长度限制,其限制取决于操作系统的支持。
3.POST 的安全性要比 GET 的安全性高。注意:这里所说的安全性和上面 GET 提到的“安全”不是同个概念。上
面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的 Security 的含义,比如:通过 GET 提交数据,用 户名和密码将明文出现在 URL 上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别 人就可以拿到你的账号和密码了,除此之外,使用 GET 提交数据还可能会造成 Cross-site request forgery 击。
Get 是向服务器发索取数据的一种请求,而 Post 是向服务器提交数据的一种请求,在 FORM(表单)中Method 默认为"GET",实质上,GET 和 POST 只是发送机制不同,并不是一个取一个发!
9.TCP和UDP的区别
| UDP | TCP | |
|---|---|---|
| 是否连接 | 无连接 | 面向连接的 |
| 是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
| 是否有序 | 无序 | 有序,消息在传输过程中可能会乱序,TCP会重新排序 |
| 传输速度 | 快 | 慢 |
| 连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
| 传输方式 | 面向报文 | 面向字节流 |
| 首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
| 适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
10.TCP的拥塞处理
11.从输入网址到获得页面的过程
12.TCP和UDP分别对应的常见的应用层协议
13.什么是http协议
14.网络七层协议和四层协议
15.rpc原理
16.滑动窗口协议
17.长连接、短链接的区别、特性、使用场景
18.常见的http返回码
200 OK:客户端请求成功
301 Moved Permanently(永久移除),请求的URL已移走。Response中应该包含一个Locationb URL,说明资源在所处的位置。
302 found:重定向
400 Bad Resquest:客户端请求有语法错误,不能被服务器所理解
401 Unauthorized:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:请求资源不存在,eg:输入了错误的URL
405 Method Not Allowd:客户端试图使用一个本资源不支持的HTTP方法。例如:一个资源只支持GET方法,但是客户端使用PUT方法访问。
500 Internal Server Error:服务器发生不可预期的错误
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
19.请求转发与重定向的区别
本质区别:转发是服务器行为,重定向是客户端行为。
重定向特点:两次请求,浏览器地址发生变化,可以访问自己web之外的资源,传输的数据会丢失。
请求转发特点:一次强求,浏览器地址不变,访问的是自己本身的web资源,传输的数据不会丢失。
20.request、response 区别联系
21.Cookie、session的区别和联系
什么是cookie?
cookie是web服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个web服务器存储cookie。以后浏览器再给特定的web服务器发送请求时,同时会发送所有为该服务器存储的cookie
什么是session?
Session 是存储在 web 服务器端的一块信息。session 对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
Cookie、session的区别
| cookie | session | |
|---|---|---|
| 位置 | 存放在客户端(当客户端禁用cookie时将无法使用cookie) | 服务器端(无论客户端怎样设置,session都能正常工作) |
| 储存大小 | 不超过4kB | 理论上没有限制 |
| 安全问题 | 不安全 | 安全 |
| 数据存储 | 只能存储 String 类型的对象 | 能够存储任意的 java 对象 |
| 语法 | if(request.Cookies["admin"]!=null | if(session["admin"]!=null |
cookie和session的联系
1、cookie和session对象一样是用来保存特定的用户相关的数据。
2、通过cookie/session的名称来区分不同的cookie/session。
3、有生命周期,cookie最大可设置为50年,session默认周期为20分钟,可以手动设置更短或更长的时间
4、使用范围,都是特定用户(如有些软件需要登陆,不一定所有人都会使用到)