计算机网络系列之协议栈解析,搞懂面试常问TCP握手与挥手

一、序言

1.1总览

前面经过学习,已经知道了在浏览器输入一个URL之后,浏览器做出了哪些反应来为了获得这个URL的内容,包括使用DNS协议获得了URL域名的IP地址,根据URL构造出HTTP请求报文,然后调用socket接口,发出报文。接下来这节就将进入协议栈的学习。
在这里插入图片描述
协议栈就是包括了TCP协议、UDP协议和IP协议以及网卡驱动程序和网卡这几部分,是被操作系统封装起来的部分。在计算机网络层次结构中属于传输层、网络层、数据链路层、物理层。对于关系如图所示
在这里插入图片描述
看到这里应该可以明白今天要学习的内容了。

1.2端口

在学习其他部分之前,先来说说端口的概念。
对于协议栈是应用层很多进程在使用的,比如web浏览器需要调用,与web服务器进行通信;邮件程序需要调用,从邮件服务器得到邮件内容等等。不同的主机也就是终端之间,可以依靠IP地址来区分谁是谁,那么都处于一个电脑或者其他设备上的进程怎么区分呢?这里引入了端口的概念,就是为每个进程在添加一个16位的标号用来识别同一台计算机上需要使用协议栈的不同进程。比如a进程(端口号5000)使用协议栈通过网络获得了数据,b进程(10000)也使用了协议栈通过网络获取了数据,协议栈就是根据5000和10000来区分将数据交给哪个进程的。
端口号分为服务器端口号和客户端端口号。因为客户端想要访问服务器端,必须知道服务器这个进程的端口号,所以服务器端的端口号都是固定的,被大家熟知,比如Web服务器http协议的端口号是80。另一类端口号是客户端,他是每个进程随机分配的,不需要固定。

二、TCP协议

我们从上至下来学习,首先是TCP协议。它的特点是:

  1. 面向连接的传输层协议,在传输数据前必须先建立连接。
  2. 提供可靠的交付服务。
  3. 提供全双工的数据传输。
  4. 具有拥塞控制、流量控制的功能。

在互联网设计的时候,就将数据传输的可靠性交给了终端来实现,本身链路之间的传输是不可靠的,出现错误的包会被立刻丢弃。TCP协议就是为了实现可靠传输而设计的协议。

2.1 TCP首部

因为数据在各个层中是按照分组来传输的,就是将大的文件,按照一定大小分成小块,然后在每一个层中,加入相应的头部信息,最终通过网卡将0和1的数字信号转发出去。与在邮寄东西一般,最开始的地址是你自己家的地址,比如xxx街道xx号,当你邮寄东西被快递员取走装车发往北京,这个时候关注的头部信息是你所在的市或县以及目的地北京,当运到北京时,又将头部层层去掉,到北京某个区,到了这个区后,将区名去掉,在到街道,最后送到目的地。
在这里插入图片描述
所以每个协议都会在传输数据前面加一些首部,用来提示自己的信息。TCP的首部如下所示:
在这里插入图片描述

  1. 源端口号和目的端口号。就是用来区分使用TCP连接的两个进程是哪个,识别使用计算机网络通信的进程。
  2. 序号和确认号。用来保证TCP的可靠传输。后面会讲解
  3. 首部长度,占4个二进制位,最大为十进制数为15,这个字段的1个1表示首部长度4字节。TCP首部长度最小是20字节,这里的字段值就是5.也就是TCP首部最长为60字节,此时这个字段的值为十进制的15.
  4. 标志位。其中ACK、FIN、SYN是用于TCP连接和释放阶段的标志位。
  5. 窗口。用于TCP的流量控制。
  6. 检验和是用来计算传输过程中是否发生了错误。

2.2 TCP是如何保证可靠传输的?

在计算机网络中,网络层、数据链路层和物理层都不能保证传输可靠,如果检验数据是错误的,就会丢弃。不会向上通知应用层,哪个数据丢失了。TCP是采用了自动控制中常见的反馈思想来实现可靠传输的,就是发送数据之后,我只有接收了对面发来的反馈信息确认收到了,才认为发送成功,否则就会重新传输。最基本的停止等待协议如下图所示,只有在收到对方的确认消息之后才继续发下一个分组。
在这里插入图片描述
当接收方收到出现差错的分组,直接丢弃。那发送方如何知道呢?发送方在发出分组之后,就会开启一个计时器,如果超过时间限制,那就自动重新传输分组,直到接收对面的确认信号。
在这里插入图片描述
这样就保证了收发消息的可靠到达。但是这种发一个就等待一次的方式,对于信道的利用率太低了。于是提出滑动窗口协议来提高信道的利用率,简单来说就是,一次不是在发一个分组,而是发送一个长度的分组,比如现在发送的分组是第一个分组,窗口大小是10,那么就一次发送第一个分组到第十个分组。对方在收到分组之后,也并不急着每个分组发出确认信号,而是在收到一定数目的分组之后在发送,比如收到了1,2,3,7,8分组,这时候回发送确认信号分组号3,告诉发送方你的1,2,3分组我都收到了,这个时候,发送方的窗口就可以向前移动三个了,此时窗口的范围就是4-13了,可以将11-13这几个分组发送出去,在等待接收方的确认信息。就以这种方式实现了信道的高利用率。

2.3 TCP的流量控制

TCP的头部拥有窗口字段,在接收方的TCP头部都会添加这个字段,告诉发送方我的缓存区还可以接收多少字节的数据,发送方根据这个值来动态调整前面提到的滑动窗口的值,这样就控制避免造成对面接收方的缓冲区溢出,导致频繁重发,这就说TCP的流量控制。
有一种特殊情况,就是当对面的缓存区为0了,发送方不能发送了,它如何得知接收方什么时候缓存区可以接收数据?TCP设置了一个持续计时器收到对方发来的零窗口后,就启动,定时时间到了就向对方询问,是否有空余的缓存区了,是否可以发送数据了。这就是TCP的流量控制的过程。

2.4TCP的拥塞控制

与流量控制不同,拥塞控制是避免每一个分组在传输的过程中发生堵塞,流量控制是避免发送方和接收方的缓存区发生溢出。TCP拥塞控制采用了慢开始、拥塞避免、快恢复、快重传的机制来实现拥塞控制。
所谓慢开始,就是在TCP传输分组开始的阶段,不知道网络的拥塞状态,所以需要慢开始,前面实现滑动窗口的窗口值设置的小一些,这个在协议里有规定,对于理解这个过程没有必要,假设窗口值开始设置为1个单位,之后没发送成功一次,即接收到接收方发来的确认报文之后,就将窗口值变为2个单位,按照指数增长,这就是慢开始的过程。
拥塞避免是这样的,前面的慢开始是有一个极限的,在开始阶段会给他设置一个窗口的极限值,当前面指数增长的窗口值达到这个值之后,就进入了拥塞避免阶段,因为指数增长速度较快,所以进入拥塞避免阶段就是线性的增长,每次滑动窗口的窗口值只增加一。这样就可以避免发生网络的堵塞。
快重传是指发送方如果连续三次都接收到接收方发出的确认号相同,那么将拥塞避免的极限值设置为当前滑动窗口值的一半,当前滑动窗口值也设置为一半,重新开始拥塞避免的线性增长阶段。
快恢复就是指发送的分组出现超时未收到接收方的确认信息,马上把拥塞避免的极限窗口值设为当前的窗口值的一半,然后将滑动窗口值设置为1,进入到慢开始阶段。
其实总结起来就是下面的流程图,cwd表示的是TCP的滑动窗口的窗口值,limit代表从慢开始到拥塞避免阶段的门限值,cwd超过这个值,cwd就进入线性增加的阶段。
在这里插入图片描述
其实滑动窗口的cwd的值是受到拥塞避免和流量控制的双重影响,所以应该取两者之间的最小值。

2.5 TCP连接与释放

客户端A向服务器B发起TCP连接请求,就是发送的TCP头部的标志位SYN=1,同时告诉对方初始的序列号x,这个序列号是随机的,并不是从1开始,这是从安全的角度考虑的。服务器如果同意B的连接请求,就向A发送确认信息,发送的TCP头部SYN=1,ACK=1,确认号为x+1,并告诉A它的初始序列号为y。A在接收到B的确认信息后,在发送一个TCP头部为ACK=1,序列号x+1,确认号为y+1。这样就完成了连接工作。
在这里插入图片描述
为什么在A接收到B的确认后还要在发送一个确认信号呢?是为了避免A的申请连接的信号在延时之后到达,导致创建无用的连接,造成资源的浪费。解释一下,比如说A发送一个申请连接的报文,但是在传输过程中在某个路由器延迟了很久,以至于A认为B没有收到,又重新发了一个申请,后发的申请先到了,B发送回了确认报文,建立了TCP连接,而此时最开始发送的请求连接又到了,于是B又发送确认连接,又建立了一个TCP连接,但是这个TCP连接是没有用的,因为没有进程通过这个TCP进行通信。所以造成了浪费。如果A在接收到B的确认后,在发送一个确认,就可以解决这个问题了。B在接收到第二次的申请之后,发送的确认A接收后,A也发送确认,B接收到后,才建立TCP连接,此时第一次的申请到来之后,B发出确认,A接收后,因为TCP连接已经建立,忽视这个确认信号,B一段时间之后没有收到A的确认,那么这个延时到达的TCP建立请求就被忽视了,这样就保证了不浪费资源。
在这里插入图片描述
TCP的释放过程可以由连接双方任一一方释放。这里以刚才建立连接的客户端A想要释放连接为例。在A发送完数据之后,不在发送数据,要释放连接,首先它会发送TCP首部SYN=1,序列号seq=u的报文告诉服务器B我要释放连接了,服务器收到后,就会发送一个ACK=1,序列号seq=v,确认号ack=u+1的报文告诉客户端A,你释放连接的请求收到了,但此时还没释放,因为可能服务器还在发送数据,服务器发完数据之后,发送SYN=1,序列号seq=w,确认号ack=u+1的报文,告诉客户端好了,我数据发完了释放连接吧,客户端A在收到这个报文之后,就返回给服务器一个ACK=1,序列号seq=u+1,确认号ack=w+1的报文告诉服务器端可以释放了。服务器B收到这个信息就会关闭了这个连接了,客户端A会等一段时间在关闭。
为什么客户端要在等一段时间呢?一个原因是为了防止它最后发送的确认信息服务器B没有收到,可以继续重传,确保TCP连接真的关闭。另一个原因是将网络上还属于这个TCP的报文全部消失掉。
在这里插入图片描述
这就是TCP的三次握手和四次挥手!

三、UDP协议

相比于TCP协议,UDP协议就简单多了。

3.1UDP协议特点

  1. UDP是无连接的,省去连接的消耗。
  2. UDP是尽最大努力去交付报文,不存在阻塞控制、流量控制
  3. UDP是不可靠传输,不保证报文的准确到达。

3.2UDP首部

UDP的首部只有八个字节,每个部分两个字节。分别为源端口号,目的端口号,报文长度以及检验和。在应用将报文交到UDP时,只是在报文前加上UDP首部,就将报文发送给网络层。

四、总结

其实计算机网络中也到处应用中反馈的思想,由此可见其实学科之间都是互通的,思想都是可以相互借鉴的。此时我们的浏览器报文又向前传输一步,接下来该进入到IP网络层和网卡的部分了!

关注下面的,回复计算机网络,可以获得免费获得电子版。让我们一起快乐的玩编程。
在这里插入图片描述

原创文章 31 获赞 8 访问量 2241

猜你喜欢

转载自blog.csdn.net/HIT_zhanmusi/article/details/105757299
今日推荐