目录
一、谈一谈对OSI七层模型和TCP/IP四层模型的理解?
二、谈一谈TCP协议的三次握手过程?
三、TCP协议为什么要三次握手?两次、四次不行吗?
四、谈一谈TCP协议的四次挥手过程?
五、什么是流量控制?
六、什么是滑动窗口?
七、什么是拥塞控制?
八、TCP和UDP有什么区别?
首先分层的原因是为了将计算机网络分为多层结构,每一层都有每一层的作用与规则,能够更好的进行网络连接。就好比发快递,从快递员从你手里拿到快递再到快递送到快递的网点进行分拣、运输到目的地的处理中心、最后到接收人收到快递这个过程。
OSI七层模型是对计算机网络的一种理想化模型,分别为:
物理层是通过网线、光缆这种物理方式将电脑连接起来,通过比特流传输。
数据链路层是将比特流封装成数据帧,对0、1进行分组。
网络层是决定数据在网络中的游走路径。
传输层是通过tcp或udp协议来为两台主机提供数据传输服务。
会话层是负责管理应用程序之间的会话,也就是会话的建立、维护和重连。
表示层是为了是数据能够被其他计算机所能理解转换成的另一种格式比如文字、视频、图片等。
应用层为最高层是最终呈现给用户的界面。
而TCP/IP四层模型是实际上的模型分层,也是对七层模型的简化版,为应用层、传输层、网络层、数据链路层。
其中应用层常见的协议有DNS域名协议、HTTP协议、邮件传输协议(SMTP、POP3、IMAP4等)、FTP传输协议等。
传输层常见的协议为TCP协议与UDP协议。
第一次握手由客户端向服务端发送一个TCP数据包,其中首部中SYN=1,ACK=0,表示这是一个请求连接数据包。
第二握手由服务端向客户端发送,其中SYN=1,ACK=1,表示服务端同意连接。
第三次握手是由客户端再次向服务端发送,其中SYN=0,ACK=1。表示双方都同意连接,并且确认收到服务端的确认数据包。
三次握手是为了避免重复连接,并且通过三次连接可以获得一个可靠的序列号seq。
如果只有两次握手的话,服务端并没有收到客户端的确认数据包、并不知到客户端是否收到服务端的确认数据包,而且无法获得初始化的序列号seq。
如果四次的话又会有些浪费资源。
第一次挥手由客户端向服务端发送,首部中FIN=1,ACK=0,表示这是一个请求断开的与服务端的连接。
第二次挥手是由服务端向客户端发送,其中FIN=0,ACK=1,表示确认收到客户端的发送的请求断开报文。此时客户端对服务端的连接就已经释放了,客户端只能接收服务端的数据包,不能发送。而服务端并没有释放,既可以接收也可以释放。
第三次挥手还是由服务端向客户端发送,其中FIN=1,ACK=1,表示服务端已经没有要向客户端发送的数据了,并释放与客户端之间的连接。此时服务端不能向客户端发送数据了,但能接收。
第四次挥手是由客户端收到对服务端的连接释放报文后,向服务端发送,其中ACK=1,FIN=0,表示确认收到收到释放报文。同意服务端释放连接。
流量控制是指接收方对于发送方发送速率的一种控制。
因为每一方都有一块固定大小的缓存空间,而接收方需要要求发送方不能发送超过接收方缓存容量的数据。接收方来不及处理发送方的数据,就会提示对方降低发送速率,防止数据包丢失。
而TCP是利用滑动窗口来进行流量控制的。在确认报文中有一个窗口字段就是设置发送方的窗口大小,从而影响发送速率。
因为如果每发送一个数据,都要等收到对方的确认收到后,才发送下一个数据的话,这样的通信效率是很慢的。而TCP协议就引入了窗口的概念。滑动窗口就是TCP协议用于实现流量控制的一种机制。
在发送发和接收方都会维护着各自的缓冲区,这个缓存区就叫窗口。窗口大小是由接收方首部中窗口这个字段来决定的。
在发送方的窗口中分别有四个区域,已经收到确认的数据、发送但没有被确认的数据、未发送但在缓存范围内的数据、未发送但超出缓存范围的区域,窗口会随着发送数据被确认而向着未发送的区域滑动。
而接收方的窗口分为成功接收并确认的数据、未收到但可以确认的数据、未收到但超出窗口范围的数据。接收方也会随着收到数据并确认后窗口向着未收到移动。接收方可以通过改变窗口大小来控制发送的速率,从而实现流量控制。
发送方需要维护一个叫拥塞窗口的状态量来决定可以同时发送多少数据包。而TCP主要通过四个算法来进行拥塞控制:
慢开始:拥塞窗口从1开始已指数的方式增长。
拥塞避免:是指当拥塞窗口的值大于慢开始门限(ssthresh)时,会进入拥塞避免,拥塞窗口的增长会从指数增长改为每次只加一的线性增长。
快重传:是指在发送拥塞开始后已经开始出现丢包,而处理丢包的方式为超时重传(发送后的时间已经到达RTO还没收到确认数据包)时,会先将慢开始门限的值改为拥塞窗口值的一半,然后将拥塞窗口的值改为1,重新进入慢开始。
快恢复:是指如果进行快重传后(收到3个重复的确认数据包),会将慢开始门限改为原来的一半,然后继续执行拥塞避免。
TCP是面向连接的,仅支持一对一通信,并且是可靠性传输,而UDP是无需连接,支持一对一、一对多、多对一、多对多,通信,不保证可靠性。但是传输效率要比TCP高。首部需要8个字节,而TCP的首部为20-60字节。
注:本篇文章都是我自己的理解,可能用词和语句不够严谨,如有错误请评论指正,谢谢!(持续更新中......)