1.三次握手与四次挥手
问题1:为什么建立TCP连接需要三次握手?
回答:是为了连接双方都能确认建立起了有效的连接。设想一种情况,客户端发起SYN请求,该请求在网络中迷路了,没有及时到达服务端,超时之后客户端重新发起了SYN请求,这时连接建立并且完成了数据传输然后正常关闭了连接,这之后第一次的SYN包又来到了服务端,服务端依然进入SYN_RCVD状态并向客户端返回确认,这时客户端收到该确认肯定是不会回应的,如果没有接下来的第三次握手,那么服务端便会以为连接建立成功了,显然这样是与事实不符的。
SYN Flood攻击,便是利用了三次握手的机制,其基本攻击原理就是不与服务端完成第三次握手,服务端会分配TCB资源,而且会多次重试对SYN请求的确认,攻击方通过发送大量这种请求来消耗服务端的有限资源。而且,服务端在收到SYN请求后就会分配TCB资源,客户端是在收到SYN+ACK之后才会分配TCB资源,这样的不对等,也为攻击提供了便利。
针对SYN Flood攻击,有一些检测手段,比如检测一段时间内成功建立连接数与未完成连接数差值,或者检测SYN请求量是否有突增。
还有一些攻击防范手段,比如利用系统参数来调整服务端重试次数,增大SYN连接数,或者拒绝新连接等方法。商业上的防火墙,一般采用连接认证的方式,比如对SYN+ACK回包里的seq或者ack数值进行处理,引入cookie来识别和防御非法连接。
问题2:谈谈对time_wait状态的理解
回答:主动发起断开连接的一端,在收到对端的FIN+ACK请求并回复确认之后,会进入TIME_WAIT状态,该状态会持续至少2MSL(Maximum Segment Lifetime)时间,RFC定义MSL为2分钟,Linux默认为60s。一方面,等待2MSL是为了在确认包丢失的情况下,让对端能够有机会再次发起FIN+ACK请求,从而完成连接关闭的流程;另一方面,在这段时间内,所有本连接发送过的报文,会在网络中陆续全部失效,这样就避免了在新建立连接之后,还收到旧连接的报文。
问题3:如果是服务端主动关闭连接,会有什么问题?
回答:
问题4:为何关闭连接需要四次挥手?
回答:关闭连接要比建立连接多一次握手,主要是考虑到一端发起关闭连接的时候,另一端可能还有部分数据没有发送,这时被动关闭端需要维持一个CLOSE_WAIT状态,在该状态下,被动关闭端可以将未发送完成的数据发送完成,然后再来继续连接关闭的流程。
问题5:如果已经建立了连接,但是客户端突然出现故障了怎么办?
回答:TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
2.HTTPS
HTTP传输明文容易被窃听,没有做身份认证容易遭遇伪装,无法验证信息完整性容易被篡改。基于这3个缺点,催生了HTTPS解决方案。https=http+ssl/tls=http+加密+认证+完整性保护。
参看这篇文章:我是这样理解HTTP和HTTPS区别的
3.TCP连接池,这里有个搞笑的问题,连接池是维护在客户端还是服务端?
4.长连接与短连接
HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。
HTTP/1.1版允许复用TCP连接,但是同一个TCP连接里面,虽然可以发起多个请求,但是所有的数据通信是按次序进行的,服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。
2015年,HTTP/2 发布,它是在谷歌SPDY协议基础上推出的最新版本。HTTP/2是二进制协议,其支持头信息压缩、多路复用、数据流、服务器推送等,可以大幅提升HTTP协议性能。
2018年,HTTP/3发布,其底层支撑是谷歌 QUIC 协议,该协议基于 UDP。
4.重传机制,超时重传,快速重传,SACK,D-SACK等。
5.流量控制,滑动窗口,Zero Window Probe技术,Silly Window Syndrome(糊涂窗口综合症),Nagle算法
6.拥塞控制,慢启动,拥塞避免,快速重传,快速恢复
7.websocket与HTPP/2的关系
websocket是一种真正全双工通信,服务端可以向客户端推送消息,是一种可控的长连接。
8.H5小游戏
9.子网划分,CIDR
CIDR表示方法:IP地址/网络ID的位数,比如192.168.23.35/21,其中用21位表示网络ID。
10.IPv4与IPv6
RFC1918规定了三个保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255。这三个范围分别处于A,B,C类的地址段,不向特定的用户分配,被IANA作为私有地址保留。这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。
IPv4地址只有42亿个,今天仍然能够支撑远远超过这一数量的互联网设备,是NAT(网络地址转换)技术在发挥巨大作用,将大量设备隐藏在NAT网关之后,透过NAT网关的功能实现公网互联。
11.上网的原理,
12.代理的原理,
13.P2P
14.epoll原理
15.DNS原理
16.session
17.大小端
参考文献: