什么是三次握手?(three-way handshake)
三次握手指的是在客户端和服务器之间用三报文握手建立TCP连接。
第一次握手时,客户端将SYN置为1,随机产生一个初始序列号seq发送给服务器,进入SYN_SENT状态;
第二次握手时,服务器收到客户端的SYN=1之后,知道客户端请求建立连接,将自己的SYN置为1,ACK置为1,产生一个acknowledge number=客户端发送的初始序列号 + 1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN-RCVD状态;
第三次握手时,客户端检查服务器发送的acknowledge number是否是自己发送的序列号+1,服务器的ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number = 服务器发的序列号 + 1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,建立连接。
-
TCP建立连接可以两次握手吗?
不可以,有两个原因:
首先,可能会出现已失效的连接请求报文段又传到了服务器端。
客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器。本来这是一个早已失效的报文段,但服务器收到此失效的连接请求报文段后,就误以为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在的client并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送数据。但服务器却以为新的运输连接已经建立,并一直等待客户端发来数据。这样,服务器的很多资源就白白浪费了。采用“三次握手”的方法可以防止上述现象发生。例如刚才那种情况,客户端不会向服务器的的确认发出确认。服务器由于收不到确认,就知道客户端并没有要求建立连接。
其次,两次握手无法保证客户端正确接收第二次握手的报文(服务器无法确认客户端是否收到),也无法保证客户端和服务器之间成功互换初始序列号。 -
TCP连接可以采用四次握手吗?为什么?
可以,但是会降低传输的效率。
四次握手是指:第二次握手中的服务器只发送ACk和acknowledge number;而服务器的SYN和初始序列号在第三次握手时发送;原来协议中的三次握手变为四次握手。出于优化目的,四次握手中的二、三可以合并。 -
第三次握手中,如果客户端的ACK未传达服务器,会怎样?
Server端:
由于服务器没有收到ACK确认,因此会重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED状态),客户端收到后会重新传ACK给服务器。
Client端,两种情况:
1、在服务器进行超时重发的过程中,如果客户端向服务器发送数据,数据头部的ACK是为1的,服务器收到数据之后会读取ACK number,进入establish状态。
2、在服务器进入CLOSED状态之后,如果客户端向服务器发送数据,服务器会以RST包应答。 -
如果已经建立了连接,但客户端出现了故障怎么办?
服务器每收到一个客户端的请求后都会重新复位一个计时器,时间通常设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出现了故障,接着就关闭连接。
什么是四次挥手?
第一次挥手时客户端将FIN置为1,发送一个序列号seq给服务器,进入FIN_WAIT_1状态;
第二次挥手:服务器收到FIN后,发送一个ACK=1,acknowledge number = 收到的序列号+1;进入CLOSED_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
第三次挥手:服务器将FIN置为1,发送一个序列号给客户端,进入LAST_ACK状态;
第四次挥手:客户端收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置为1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL时间后,也进入CLOSED状态。完成四次挥手。
TCP如何实现流量控制
使用滑动窗口协议实现流量控制。防止发送方发送速率太快,接收方缓存区不够溢出。接收方会维护一个接收窗口receiver window(窗口大小是字节),接收窗口的大小是根据自己的资源情况动态调整的,在返回ACK时接收窗口大小放在TCP报文中的窗口字段告知发送方。发送窗口的大小不能超过接收窗口的大小,只有当发送方发送并且收到确认后,才能将发送窗口右移。
发送窗口的上限为接收窗口和拥塞窗口中的较小值。接收窗口表明了接收方的能力,拥塞窗口表明了网络的传送能力。
TCP的拥塞控制是怎么实现的?
拥塞控制主要由四个算法组成:慢启动、拥塞避免、快重传、快恢复。
1、慢启动:刚开始发送数据时,先把拥塞窗口设置为一个最大报文段MSS的数值,每收到一个新的确认报文之后,就把拥塞窗口加1个MSS,这样每经过一个传输轮次(或者说每经过一个往返时间RTT),拥塞窗口的大小就会加倍。
2、拥塞避免:当拥塞窗口的大小达到慢启动门限时,开始执行拥塞避免算法,拥塞窗口大小不再指数增加,而是线性增加,即每经过一个传输轮次只增加1MSS。
3、快重传:快重传要求接收方在收到一个失序的报文段后就立即发出重复确认,为的是使发送方及早知道有报文段没有到达对方,而不是等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
4、快恢复:当发送方连续收到三个重复确认时,就把慢开始门限减半,然后执行拥塞避免算法。不执行慢开始算法的原因:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方认为网络可能没有出现拥塞。
TCP如何最大利用带宽?
TCP速率受到三个因素影响:
- 窗口:即滑动窗口大小
- 带宽:这里带宽是指从发送端到接收端所能通过的“最高数据率”,是一种硬件限制。TCP发送端和接收端的数据传输数不可能超过两点间的带宽限制。发送端和接收端之间带宽取所通过路线的带宽最小值。
- RTT:表示从发送端到接收端的一去一回需要的时间,TCP在数据传输过程中会对RTT进行采样(即对发送的数据包及其ACK的时间差进行测量,并根据测量值更新RTT值),TCP根据得到的RTT值更新RTO值,就是重传间隔,发送端对每个发出的数据包进行计时,如果在RTO时间内没有收到所发送的数据包的对应ACK,则任务数据包丢失,将重传数据,一般RTO值都比采样得到的RTT值要大。
TCP与UDP的区别
1、TCP是面向连接的,UDP是无连接的。
- 什么是无连接
UDP发送数据前不需要建立连接。
2、TCP是可靠的,UDP不可靠。
- 什么叫不可靠
3、TCP只支持点到点通信,UDP支持一对一、一对多、多对一、多对多。
4、TCP是面向字节流的,UDP是面向报文的。
- 什么意思
5、TCP有拥塞控制机制,UDP没有。网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用是很重要的,比如媒体通信,游戏;
6、TCP首部开销(20字节),比UDP首部开销(8字节)要大
7、UDP的主机不需要维持复杂的连接状态表
- 什么时候选择TCP,什么时候选择UDP?
对某些实时性要求比较高的情况,选择UDP,比如游戏、媒体通信、实时视频流(直播),即使出现传输错误也可以容忍;其他大部分情况下,HTTP都是用TCP,因为要求传输的内容可靠,不出现丢失
- HTTP可以使用UDP吗?
HTTP不可以使用UDP,HTTP需要基于可靠的传输协议,而UDP不可靠。
- 面向连接和无连接的区别
无连接的网络服务(数据报服务) -- 面向连接的网络服务(虚电路服务)
虚电路服务:首先建立连接,所有的数据包经过同样的路径,服务质量有好的保证
数据报服务:每个数据包含目的地址,数据路由相互独立;网络尽最大努力交付数据,但不保证不丢失、不保证先后顺序、不保证在时限内交付;网络发生拥塞时,可能会将一些分组丢弃。
TCP如何保证传输的可靠性
1、数据包校验
2、对失序数据包重新排序(TCP报文具有序列号)
3、丢失重复数据
4、应答机制:接收方在收到数据后,会发送一个确认(通常延迟几分之一秒)
5、超时重发:发送方发出数据后,启动一个定时器,超时未收到接收方的确认,则重新发送这个数据
6、流量控制:确保接收端能够接收发送方的数据而不会缓冲区溢出
HTTP和HTTPS有什么区别?
1、端口不同:HTTP使用的是80端口,HTTPS使用443端口
2、HTTP(超文本传输协议)信息是明文传输,HTTPS运行在SSL之上,添加了加密和认证机制,更加安全;
3、HTTPS由于加密解密会带来更大的CPU和内存开销;
4、HTTPS通信需要证书,一般需要向证书颁发机构购买。
- HTTPS的连接过程?
1、客户端向服务器发送请求,同时发送客户端支持的一套加密规则(包括对称加密、非对称加密、摘要算法);
......
- 你访问的网站是如何自动切换到 HTTPS 的?
一种是原始的302跳转,服务器把所有的HTTP流量跳转到HTTPS。但是这样有一个漏洞,就是中间人可能在第一次访问站点的时候就劫持。解决方法是引入HSTS机制,用户浏览器在访问站点的时候强制使用HTTPS。
- HTTPS连接的时候,怎么确定收到的包是服务器发来的(中间人攻击)?
1、验证域名、有效期等信息是否正确。证书上都有包含这些信息,比较容易完成验证。
2、判断证书来源是否合法。
3、判断证书是否被篡改。
4、判断证书是否已吊销。
- 什么是对称加密、非对称加密?区别是什么?
对称加密:加密和解密采用相同的密钥。如:DES、RC2、RC4
非对称加密:需要两个密钥:公钥和私钥。如果用公钥加密,需要用私钥才能解密。如:RSA
区别:对称加密速度更快,通常用于大量数据的加密;非对称加密安全性更高。
- 数字签名、报文摘要的原理
发送者A用私钥进行签名,接收者B用公钥验证签名。因为除A外没有人有私钥,所以B相信签名是来自A。A不可抵赖,B也不能伪造报文。
GET和POST的区别?
1、GET是幂等的,即读取同一个资源,总是得到相同的数据,POST不是幂等的。
2、GET一般用于从服务器获取资源,而POST有可能改变服务器上的资源;
3、请求形式上:GET请求的数据附在URL上,在HTTP请求头上;POST请求的数据在请求体中;
4、安全性:GET请求可被缓存、收藏、保留到历史记录,且其请求数据明文出现在URL中。POST的参数不会被保存,安全性相对较高。
5、GET只允许ASCII字符,POST对数据类型没有要求,也允许二进制数据;
6、GET的长度有限制,而POST数据大小无限制。
Session与Cookie的区别?
Session是服务器端保持状态的方案,Cookie是客户端保持状态的方案
Cookie保存在客户端本地,客户端请求服务器时会将Cookie一起提交;Session保存在服务器端,通过检查Sessionid查看状态。保存Sessionid的方式可以采用Cookie,可以使用URL重写机制。
从输入网址到获取页面的过程?
1、浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或迭代查询。
2、浏览器获得域名对应的IP地址后,浏览器向服务器请求建立链接,发起三次握手。
3、TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
4、服务器接收到这个请求后,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
5、浏览器解析并渲染视图,若遇到对js文件,css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
6、浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
HTTP请求有哪些常见状态码?
1、2xx状态码:操作成功。200 OK
2、3xx状态码:重定向。301永久重定向;302暂时重定向。
3、4xx状态码:客户端错误。400 Bad Request; 401 Unauthorized; 403 Forbidden; 404 Not Found;
4、5xx状态码:服务端错误。500服务器内部错误;501服务器不可用
什么是RIP(距离矢量路由协议)?算法是什么?
每个路由器维护一张表。记录该路由器到其他网络的“跳数”,路由器到与其直接连接的网络的跳数是1,每多经过一个路由器跳数就加1;更新该表时和相邻路由器交换路由信息;路由器允许一个路径最多包含15个路由器,如果跳数为16,则不可达。交付数据报时优先选择距离最短的路径。
计算机网络体系结构
1、物理层
2、数据链路层
3、网络层
4、运输层
5、应用层
应用层常见协议:
FTP(21端口):文件传输协议
SSH(22端口):远程登陆
SMTP(25端口):发送邮件
POP3(110端口):接收邮件
HTTP(80端口):超文本传输协议
DNS(53端口):运行在UDP上,域名解析服务
传输层:TCP/UDP
网络层:IP、ARP
路由器、交换机位于哪一层?
路由器网络层、根据IP地址进行寻址;
交换机数据链路层,根据MAC地址寻址。
什么是ARP协议?
ARP协议完成了IP地址与物理地址的映射。