最近准备面试,所以会收集一些不懂得题目然后进行答案的搜索,以下答案基本都是来自网络,然后进行了一点删减和自己的总结,如果有侵权,请评论或者私信联系我,我马上删除
TCP如何保证传输可靠性(校验和,序列号和确认应答号,重传,流量控制,拥塞控制)
答:1、校验和
2、序列号和确认应答号:发送方的数据拥有序列号,接收方发送的已接收信号ACK是应当接收的下一个包的序列号
3、超时重传:发送方等待两个来回时间没收到接收信号,就会重发。接收方接收到重发的包,根据之前是否已经接收到这个包来选择丢弃或者接收,并最终都会发送一个接收信号ACK
4、流量控制:接收端会在确认应答发送ACK报文时,将自己的即时窗口大小填入,并跟随ACK报文一起发送过去。而发送方根据ACK报文里的窗口大小的值的改变进而改变自己的发送速度。如果接收到窗口大小的值为0,那么发送方将停止发送数据。并定期(一个超时重发的时间)的向接收端发送窗口探测数据段,让接收端把窗口大小告诉发送端。
5、拥塞控制:慢启动,指数增长,到达阈值之后线性增长; 发生拥塞之后,拥塞阈值(即开始变成线性增长的阈值)就会变为拥塞发送时窗口的一半
注意:实际的发送窗口大小取决于流量控制的窗口和拥塞窗口中较小的一个
DNS为什么使用udp协议
答:1、DNS不适用于TCP的长连接,只需要单次的数据获取(无上下文要求),用UDP更适用于这种场景
2、如果使用TCP,那么DNS服务器就会有大量的连接,并且需要建立TCP连接的时间
3、DNS传输的数据比较小,使用UDP已经足够,速度够快就行
浏览器输入url后的过程
1、浏览器查找当前URL是否存在缓存,并比较缓存是否过期,如果是就通过DNS解析URL对应的IP。
浏览器DNS缓存—>操作系统DNS缓存—>本地域名服务器—>根域名服务器—>com域顶级域名服务器—>下一个域名服务器—>本地域名服务器—>操作系统DNS缓存—>浏览器DNS缓存—>浏览器得到ip地址
2、根据IP建立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(TCP连接成功)状态,完成三次握手
3、HTTP发起请求。
完整的HTTP请求包含请求起始行、请求头部、请求主体三部分。
4、服务器处理请求,浏览器接收HTTP响应。
状态码,响应头,响应报文
5、渲染页面,构建DOM树。
6、关闭TCP连接(四次挥手)。
- 第一次挥手是浏览器发完数据后,发送FIN请求断开连接。
- 第二次挥手是服务器发送ACK表示同意,如果在这一次服务器也发送FIN请求断开连接似乎也没有不妥
- 考虑到服务器可能还有数据要发送,所以服务器发送FIN应该放在第三次挥手中
- 这样浏览器需要返回ACK表示同意,也就是第四次挥手
全连接队列和半连接队列?
答:半连接是指客户端发送一个Syn包企图建立连接,服务器收到这个Syn后把该连接加入到半连接队列,并返回Syn包以求得客户端的最终确认,但是客户端不发生确认,导致多个连接塞满半连接队列,最后不得不抛弃新到的连接请求,又称为DDos攻击。虽然在多次服务器重传失败下,服务器会抛弃认为已经失效的半连接请求,但是只要半连接请求不断打过来,最后还是会崩溃。
解决办法:利用Syn_Cookies方法去减少资源分配(时间戳和序号),不再使用半连接队列
全连接队列是指已经建立完成连接的请求的队列,如果该队列已满,则会抛弃掉新到的请求
![img](https://images2015.cnblogs.com/blog/813613/201606/813613-20160625230232547-1660192246.png)
Https?
答:Https是http加上SSL,利用了对称加密算法与非对称加密算法,其中数据的交换使用的是对称加密,而对称加密前获取密钥的过程使用的是非对称加密,就是用这个非对称加密过程来保证对称加密的安全。
对称加密:数据交换的双方使用同一把密钥,用该密钥加密的信息只能用该密钥解密。效率比较高
非对称加密:持有一把公钥和一把私钥。公钥加密的信息只有私钥能解,私钥加密的信息只有公钥能解。效率比较低
https数据交换时使用的是对称加密,为了让客户端和服务器端拿到同一把密钥,这个过程就必须保密,如果被他人截取到了这把密钥那后续的信息都暴露了。
先采用非对称加密的方式来获取对称加密的密钥:客户端先生成对称加密的密钥,然后使用服务端的公钥进行加密,把加密后的密钥发送给服务端,服务端利用私钥解密得到密钥,在这个单向的过程中,其他人无法解开这个密钥,因此是安全的。
客户端使用的服务端的公钥其实是一个证书,由CA机构进行颁布,包含了公钥、域名等待信息。如果他人申请了一个CA证书企图替代其他公钥也是不可能的,因为包含了域名信息,可以防伪。
为了防止传输过程中数据被篡改,客户端可以将数据使用哈希算法得到hash值再用自己的私钥加密,服务端收到后用公钥解密然后进行hash,如果hash值不一致则说明被篡改。而其他人一旦篡改了数据就会导致hash值不一样,并且也无法利用公钥加密。
ping主要是使用什么协议?
答:TCP/IP模型中的ICMP协议
Time_wait的作用?
答:在四次挥手的时候,服务器端在接收到客户端发出的FIN M指令并返回一个ACK M+1指令后,会发送完最后一个数据包N,而客户端接收到数据包N之后,会发送一个ACK N+1表示真的关闭连接,并且进入Time_wait状态,会等待2MSL即两个数据包在互联网中最大的存活时间。如果不进入到Time_wait而是直接关闭,服务端可能会因为接收不到ACK N+1而不关闭连接,因为要重发这个数据包N,而客户端的Time_wait就是为了以防服务端没有接收到ACK N+1而重发的这个数据包N,如果接收到了,客户端就要再发一次ACK N+1,直至真的关闭。Time_wait一般持续1到4分钟。
TCP里面遇到滑动窗口为0会发生什么?
答:TCP规范中要求:当接收方窗口为0时,发送方继续发送一个字节数据的报文段。这些报文段将会被接收方确认,这样可以保持TCP连接不中断。
TCP粘包听说过吗?怎么进行分割,还有吗(换行符/记录包大小)?UDP有沾包问题吗(MTU)
答:1、TCP粘包就是指多个数据连续发送,在接收端的缓冲区里无法进行单个数据包的分辨,就像是粘作一团,前一个数据包的尾连着后一个数据包的头。
2、出现粘包的原因可能来自接受端(接收缓冲区存储多个包)也可能来自发送端(默认使用Nagle算法,收集多个小包一起发送)
3、如果这些包本来就是一起的那就不用处理,如果不是那就需要进行处理
4、处理方法:发送方:关闭Nagle算法;接收方:无法解决
应用层:1、开始标记、结束标记,但是得保证数据中不包含这两个标记 2、记录包的大小
TCP和UDP的区别?
答:1、TCP是面向连接的,而UDP是无连接的,即TCP需要经过三次握手进行连接,四次挥手来断开连接。就像打电话和寄信的区别。
2、TCP利用校验和、序列号、超时重传、确认应答号、流量控制、拥塞控制来保证可靠性,而UDP不保证可靠性,只求尽量交付
3、UDP具有较好的实时性,效率比较高,适合直播、游戏等业务;而TCP的可靠性适合传输文件等数据
4、TCP需要进行连接因此会比较占用系统资源,而UDP占用的资源较少
5、数据头所包含的信息也就不一样,并且最大长度也不一样,UDP是64K,而TCP得看发送接收双方
HTTP详细一点?
答:1、基于TCP/IP协议,来传递超文本信息,如html文件、文件、图片等。
2、允许对数据类型进行标记,Content-Type标记了数据的类型
3、是无状态的,指的是一次请求对应一次响应。如果为了有状态去维护上下文的话会占用资源,并且一次中间错误需要重传前边的信息
4、keep-alive可以使tcp保持连接