1.OSI七层模型和TCP/IP四层模型?
OSI七层模型:
1.物理层:利用网线、光缆等传输介质为数据链路层提供物理连接,实现比特流的透明传输;
2.数据链路层:把物理层的比特流封装成帧,与其他计算机进行通信,同时通过端口之间的连接,寻找Mac地址;
3.网络层:管理网络之间的数据通信,控制数据链路层和传输层之间的信息转发,建立、维护和终止网络连接,并向传输层提供基本的端到端之间的数据传输服务;
4.传输层:向终端用户之间提供透明的数据传输,向上三层提供可靠的传输服务;
5.会话层:组织和协调两个进程之间的通信,并对数据交换进行管理;
6.表示层:处理用户信息的表示问题,如编码、格式转换和加密解密等;
7.应用层:向用户体提供服务,完成用户请求的工作;
TCP/IP四层模型:
1.应用层:负责定义应用程序之间的通信和交互规则,常见的协议:DNS(域名解析协议)、HTTP(超文本传输协议)、SMTP、POP3、IMAP4(电子邮件协议)、Telnet(远程登录协议)、FTP(文件传输协议);
2.传输层:负责定义两台主机进程之间的通信,提供数据传输服务,提供端到端的可靠性传输,主要使用TCP(传输控制协议)、UDP(用户数据报协议);
3.网络层:把传输层产生的报文段和用户数据报封装成祖或包,选择合适的网间路由和交换节点进行数据的实际传输,只要使用IP协议;
4.网络接口层:为网络提供链路级别的传输服务,负责在以太网这样的底层网络发送原始数据包,使用MAC地址识别网络中的设备;
2.谈谈TCP协议的3次握手过程?
第一次握手:客户端向服务器发送一个同步数据包,表示这是一个请求建立连接的数据包,同步SYN=1,确认ACK=0,序号seq=x;
第二次握手:服务器收到客户端的数据包后根据SYN=1,ACK=0,判断出这是客户端主动建立连接的数据包;如果服务器同意,发送同步SYN=1,确认ACK=1,序号seq=y,确认号ack=x+1;
-
确认ACK=1,代表服务器同意连接;
-
序号seq=y由服务器指定,表示服务器发送数据时的第一个数据字节的序号;
-
确认号ack=x + 1,表示服务器已经收到x个字节数据,告诉客户端下一个从x + 1开始发送;
第三次握手:客户端收到服务器确认后,再给服务器发送一个数据包,TCP首部内容:同步SYN=0,确认ACK=1,序号seq=x + 1,确认号ack=y + 1;
-
SYN=0表示双方已同意建立连接;
-
确认ACK=1表示收到服务器的确认数据包;
-
序号seq=x + 1表示发出的数据包是数据的第x + 1个字节;
-
确认号ack=y + 1表示收到服务器发送y字节数据,并告诉服务器下次从数据的第y + 1个字节开始发送;
3.TCP协议为什么要3次握手?2次,4次不行吗?
TCP建立连接时,通过三次握手能防止历史连接的建立,减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。
不能 [ 两次握手 ] 和 [ 四次握手的原因 ]:
- 两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
- 四次握手:三次握手就已经理论上建立了最少可靠连接,所以不需要使用更多的通信次数;
4.谈谈TCP协议的四次挥手过程?
第一次挥手:客户端向服务器发送连接释放的请求数据包,并停止发送数据。首部格式为:FIN=1,ACK=0;
- FIN=1表示客户端要主动释放客户端->服务器的TCP连接;
第二次挥手:服务器收到连接释放的报文后,向客户端发送确认数据包,首部格式:FIN=0,ACK=1;(通过第二次挥手,客户端到服务器的连接就释放了,TCP连接处于半关闭状态,此时客户端无法向服务器发送数据,但服务器可以向客户端发送数据)
- ACK=1表示服务器收到了客户端发送的数据包,同意客户端释放连接;
第三次挥手:若服务器已经没有向客户端发送数据,其应用进程就通知TCP释放连接,并向客户端发送确认报文,首部格式为:ACK=1,FIN=1;此时,服务器不再向客户端发送数据,但能接收;
- 确认ACK=1,表示服务器已经把需要发给客户端的数据发完了;
- 终止FIN=1,表示服务器要释放服务器->客户端的TCP的连接;
第四次挥手:客户端收到服务器的连接释放报文后,向服务器发送确认报文,首部格式为:ACK=1,FIN=0;
- 确认ACK=1表示收到服务器的确认报文,并同意服务器释放连接;
5.什么是流量控制?
流量控制是为了控制发送方的发送速率,保证接收方来得及接收。
TCP连接的每一方都有一个缓冲区,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收端来不及处理发送端的数据,能提示发送端降低发送的速率,防止包丢失,从而实现流量控制。
6.什么是滑动窗口?
滑动窗口是TCP协议用于实现流量控制的一种机制。
发送方和接收方分别维护各自的缓冲区,这个缓冲区就是窗口,发送方的窗口大小由接收方的TCP首部的窗口字段决定。
发送方的窗口内容分为:已发送并确认,已发送未确认,未发送未超出接收方窗口范围,未发送但超出接收方窗口范围。随着接收方的确认,发送方将不断在窗口内向前滑动。
接收方将窗口内容分为:接受已确认,未收到但可以接受,接收方通过改变窗口大小,可以控制发送方的速率,从而实现流量控制。
7.什么是拥塞控制?
拥塞控制,指防止过多的数据注入网络,保证网络中的路由器或链路稳定。TCP主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复;
慢开始:拥塞窗口从1开始,采用加倍计算方式,由小到大逐渐增大;
拥塞避免:慢开始每个轮次都将cwnd加倍,会使cwnd增长速度非常快,从而使得发送方发送的速度增长过快,网络拥塞的可能性也就更高。设置一个慢开始门限ssthresh,当cwnd>=ssthresh时,进入拥塞避免,每个轮次加1,降低拥塞窗口的增长速度;
拥塞发生:将慢启动的指数增长变为线性增长,整体呈增长趋势但增长速度缓慢,直到发生拥塞,触发重传机制;当网络出现拥塞,会发生数据包重传,重传机制主要有两种:
当发生超时重传的拥塞发生算法:
- ssthresh设为cwnd/2
- cwnd设为1
然后重新进入慢开始;
当接收方发现数据包丢失时,会连续发送三次ACK确认数据包,于是就会启动快重传:
- cwnd=cwnd/2
- ssthresh=cwnd
然后进入快速恢复;
快恢复:快速恢复一般和快速重传算法同时使用,快速恢复算法是认为,你还能收到 3
个重复 ACK
说明网络拥塞状况没有特别糟糕,所以没有必要像 RTO 超时重传直接进入慢启动,那么强烈。 快速恢复算法如下:
- 拥塞窗口
cwnd = ssthresh + 3
(+3
代表有 3 个ACK确认数据包被收到了); - 重传丢失的数据包;
- 如果再收到重复的
ACK
,那么cwnd
增加1
;
8.TCP和UDP有什么区别?
- 面向连接:TCP协议需要建立连接,仅支持一对一通信;UDP协议无需建立连接,支持一对一、一对多、多对一和多对多的交互通信。
- 可靠传输:TCP协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP不保证可靠性传输。
- 性能效率:TCP协议传输效率慢,需要较多的资源开销。UDP协议传输效率快,需要较少的资源开销。
- 首部格式:TCP协议的首部需要20-60个字节,UDP协议需要8个字节。