面试题总结——网络
1、三次握手和四次挥手:
必要知识:
ACK:称为确认ACK,当ACK等于1时确认号字段有效,否则无效,TCP规定,在连接建立之后所有有传送的报文段都必须将ACK置为1;
seq:数据包的大小长度。
确认号:期望收到的下一个报文段的序号
SYN:同步SYN,在建立连接时用来同步序号;当SYN=1,ACK=0,则表示这是一个连接请求报文段,若对方同意建立连接,则相应报文中SYN=1,ACK=1;
终止FIN:用来释放一个连接,当FIN=1时则表示此报文段的发送方数据已发送完毕,并请求释放连接。
- 客户端向服务端发送带有syn标志的数据包;
- 服务端向客户端发送带有syn和Ack标志的数据包
- 客户端向服务端发送带有Ack标志的数据包
- 三次握手是指在建立TCP连接时,客户端与服务端进行发送能力与接收能力判断的过程。还未建立连接时客户端处于Closed(关闭)状态,服务端处于Listen监听状态。三次握手是客户端主动建立连接;
第一次握手,客户端向服务端发送一个SYN报文(握手报文),请求与服务器建立连接,此时客户端处于SYN_SENT(等待回复)状态;
第二次握手,服务端收到SYN报文后,此时服务端处于SYN_RCVD(同步收到)状态,会给客户端的SYN报文回应一个ACK报文(确认报文)与此同时也会向客户端发送一个SYN报文,请求与客户端建立连接;
第三次握手,客户端收到SYN+ACK报文后处于ESATABLISHED(就绪)状态,会回应一个ACK报文给服务端,当服务端收到该ACK后也会处于ESTABLISHED就绪状态。连接建立成功。
为什么进行三次握手?
第三次握手是防止已经失效的连接请求报文到达服务器,使服务器错误打开。
四次挥手:
- 客户端向服务端发送带有FIN标志的数据包;
- 服务端向客户端发送带有Ack标志的数据包,这时服务端可能还有未发送完的数据。
- 当服务端发送完要发送的数据时,服务端向客户端发送带有FIN标志的数据包
- 客户端向服务端发送带有Ack标志的数据包
- 四次挥手是指断开TCP连接时,未断开时两端都处于ESTABLISHED状态;
第一次挥手,客户端给服务端发送一个FIN报文,此时客户端处于FIN_WAIT1(终止等待1)状态;
第二次挥手,服务端收到FIN报文后,向客户端发送ACK报文,此时服务端处于CLOSE_WAIT(关闭等待)状态,客户端到服务端的连接释放,客户端收到ACK报文后处于FIN_WAIT2(终止等待2)状态;
第三次挥手,服务端也要断开连接,向客户端发送FIN报文,此时服务端处于LAST_ACK(最后确认)状态;
第四次挥手,客户端收到FIN报文后,向服务端发送ACK报文,此时客户端处于TIME_WAIT状态,等待2*MSL的时间以确保服务端收到客户端的ACK报文后客户端才会进入CLOSED状态,当服务端接收到该ACK报文后,服务端处于CLOSED状态。成功断开连接。
第三次握手时ACK报文丢失会发生什么?
服务器会在等待响应的时间后,从新发送带有ACK和SYN标志的报文,在一定的次数后如果还没有收到客户端的响应。则会关闭本次连接。
TIME_WITE和2MSL(报文最大生存时间)的作用?
因为网络是不可靠的,有可能客户端发给服务端的ACK报文在网络中丢失,而这时服务端的状态的处于LAST_ACK状态而不是处于CLOSED状态,因此客户端可以在TIME_WITE状态下重新发送丢失的ACK报文。(如果丢失服务端在发送FIN包等待2MASL后就收不到ACK,这时服务端重发FIN包,客户端可以接受到并重发ACK)
GET和POST的区别
- GET是向特定资源发出请求;POST是向指定资源提交数据并发出请求。
- GET的请求大小受限于URL的长度,而POST在请求体中,通常没有限制。
- GET请求将提交的数据直接放在URL上,没有安全性;POST请求数据则在请求体中,相对安全。
HTTP和HTTPS的区别?
- URL:HTTP以HTTP开头,HTTPS以HTTPS开头;
- 端口号:HTTP是80端口,HTTPS是443端口;
- 安全性:HTTP是明文传输,HTTPS是用SSL加密传输。
- HTTP运行于TCP上,HTTPS运行于SSL/TLS上,而SSL/TLS运行于TCP上,因此HTTP没有HTTPS安全性高,而HTTPS却比HTTP更耗费服务器资源。
TCP和UDP的区别?
- UDP:无连接的,面向数据报的,不可靠的,多用于文件传输
- TCP:有连接的,面向字节流的,可靠的,多用于即时通讯。
UDP为什么面向数据报?TCP为什么面向字节流?
- UDP:应用层交给UDP多长的报文,UDP会无脑的照样发送给IP,所以应用层要控制报文的大小
- TCP:TCP因为要保证可靠性,TCP会将应用层传来的数据块进行分割和合并。所以面向字节流。
TCP如何保证可靠传输?(为什么TCP是可靠的?)
- 确认应答机制:确认应答ACK机制,每个ACK应答都带有对应的确认序列号,告知发送者,我已经接收了那些数据,下次从哪里开始发。
- 超时重传机制:若对方没有返回确认应答ACK报文,则发送方隔一段时间后,再次传输同样的数据,降低丢包的可能。
- 连接管理机制:先确保对方的发送和接受能力是否完好。
滑动窗口机制
- 产生原因:是为了进行流量控制
- 具体操作:接收端将接受端缓冲区的大小赋值为TCP首部的“窗口大小”字段,并通过确认应答ACK报文返回给发送端,发送端会根据这个窗口大小的数值来动态的调整自己的发送速度。
快速重传机制:
在滑动窗口中就不是使用超时重传机制了,而是使用的快速重传机制。若发生端连续三次收到相同的序列号,则说明该序列号对应的数据报应该要重新发送。
流量控制机制;
产生原因:由于接收方缓冲区大小存在限制,一旦发送方发送数据太快,会导致接收方缓冲区塞满,若继续发送数据,则会导致数据溢出,因此要采用流量控制决定发送方的发送速度。
流量控制机制:接收端将接受端缓冲区的大小赋值为TCP首部的“窗口大小”字段,并通过确认应答ACK报文返回给发送端,发送端会根据这个窗口大小的数值来动态的调整自己的发送速度。
延迟应答机制:接受端处理数据的速度比较快,接受端可能会快速处理出大量的窗口大小,如果此时窗口大小较小,立即进行应答的话,就会浪费大量的缓冲区,而采用延迟应答的话,则会放大窗口大小,使网络的吞吐量变大,效率也就越高
捎带应答机制:TCP发送确认应答的同时也可以发送其他数据。
拥塞控制机制
- 产生原因:由于不清楚当前网路的状态,因此不能直接发送大量的数据,若在网络拥塞的情况下传输大量数据可能导致网络瘫痪。
- 拥塞控制:采用慢启动机制,先发少量的数据探测当前网络的拥堵状况,再决定按多大的速度进行发送。
实际滑动窗口的大小=min(流量控制窗口的大小,拥塞控制窗口的大小)
自动重传机制(ARQ协议)
ARQ协议通过确认和超时两个机制,在不可靠服务的基础上实现了可靠的信息传输,ARQ协议包括停止等待ARQ协议和连续ARQ协议。
Cookie和Session的区别
cookie和session都是用来跟踪浏览器用户身份的会话方式。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
1.Cookie的工作原理
(1)浏览器端第一次发送请求到服务器端
(2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
(3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie
(4)服务器端通过Cookie中携带的数据区分不同的用户
2.Session的工作原理
(1)浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
(2)浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
(3)服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。
name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookie
name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象
value为SessionId不存在**(Session对象默认存活30分钟)**,返回1中重新去创建Session与特殊的Cookie
value为SessionId存在,返回session对象
浏览器输入URL后的过程?
- 浏览器通过浏览器缓存、路由器缓存、或DNS服务器解析URL生成对应的IP地址及端口;
- 浏览器调用Socket连接;
- 进行TCP的三次握手;
- 封装成ip数据报;
- 通过目标IP和路由表确定下一跳IP
- 通过下一跳IP和ARP表确定目标MAC地址
- 封装成以太帧进行传输
- 服务器进行处理并响应;
- 浏览器渲染页面。
HTTP
HTTP长连接与短连接(实际上使TCP协议的长连接和短连接)
短连接:HTTP/1.0默认使用短连接,所谓短连接就是客户端与服务器端每进行一次HTTP操作就建立一次TCP连接,任务结束就中端连接。(建立连接后完成一次请求就关闭)(多用于连接较多的连接,如Web网站,并发量大)
长连接:HTTP/1.1默认使用长连接,用以保持连接活性,实现长连接需要客户端和服务器端都支持长连接(长连接响应头添加:Connection:Keep-alive,Keep-alive不会永远保持连接,不同服务器会设定该保持时间)(多用于操作频繁的连接:数据库连接)
HTTP常见方法:
GET
POST
PUT:上传文件
DELETE:删除文件
HTTP请求/响应格式
请求:
①首行,请求方法+URL+协议及版本号
②协议头header
③空行(header的结束标记)
④正文body
响应:
①首行,协议及版本号+响应状态码+状态码描述信息
②协议头header
③空行
④正文body
HTTP协议常见的请求头
Content-Type:body部分的数据格式(text/html…)
Content-Length:body部分的长度
Host:访问哪个主机的哪个端口
referer:当前页面是从哪个页面跳转过来的
location:搭配3XX状态码使用,告诉客户端接下来要访问哪里
Cookie:在客户端存储少量信息,用于实现会话session的功能