说明:本笔记出自慕课网 @咚咚呛老师 的课程《编程必会基础 计算机网络+操作系统+计算机组成原理》,有兴趣的小伙伴可以移步学习,在此我只是进行了部分笔记的整理,知识也没有很深入,也希望与大家交流。如果想要深度学习计算机网络,推荐书籍:《计算机网络》。接下来会陆续更新。。。
上一节:计算机网络(2)网络层 https://blog.csdn.net/Sabrina_cc/article/details/106218621
目录
一、概述
传输层主要进为应用层提供服务,是用户功能的最底层
端到端通信连接,进程与进程的通信。
传输层使用端口(Port)来标记不同的网络进程; 端口(Port)使用16比特位表示(0~65535)
传输层协议:TCP, UDP
二、UDP协议详解
UDP(User Datagram Protocol: 用户数据报协议)是一个非常简单的协议
1. 数据报
数据报是应用层传输过来的完整的数据
UDP对于数据报:不拆分、不合并,直接封装传输。
2. UDP的特点
(1)UDP是无连接协议(不用提前建立连接)
(2) UDP不能保证可靠的交付数据(“想发就发”,“无法保证数据在网络中是否丢失”)
(3)UDP是面向报文传输的(不做修改直接发送)
(4)UDP没有拥塞控制(不会感知网络拥塞,无论任何情况都会持续发送数据)
(5)UDP的首部开销很小
三、TCP协议详解
TCP(Transmission Control Protocol: 传输控制协议)是计算机网络中非常复杂的一个协议
1. TCP协议的特点
(1)TCP是面向连接的协议
(2)TCP的一个连接有两端(点对点通信)
(3)TCP提供可靠的传输服务
(4)TCP协议提供全双工的通信(两者可以同时可以接收和发送数据)
(5)TCP是面向字节流的协议
2. TCP头部
(1)序号:0~2^32-1;一个字节一个序号;数据首字节序号
(2)确认号:一个字节一个序号;期望收到数据的首字节序号(确认号为N:则表示N-1序号的数据都已经收到)
(3)TCP标记:占6位,每位各有不同意义
(4)窗口:占16位:0~2^16-1;窗口指明允许对方发送的数据量
(5)紧急指针:紧急数据(URG=1);指定紧急数据在报文的位置
3. 可靠传输的基本原理
1)停止等待协议
发送一个消息后,就停止发送,等待,确认之后载发送下一个消息。
停止等待协议是最简单的可靠传输协议; 停止等待协议对信道的利用效率不高。
超时重传(三种情况)
(1)发送的消息在路上丢失了
(2)确认的消息在路上丢失了
(3)确认的消息很久才到
超时定时器:每发送一个消息,都需要设置一个定时器
2)连续ARQ协议
ARQ(Automatic Repeat reQuest:自动重传请求)
既然单个发送和确认效率低, 可不可以批量发送和确认?使用滑动窗口,可以提高信道利用率。
4. TCP协议的可靠传输
TCP的可靠传输基于连续ARQ协议; TCP的滑动窗口以字节为单位
选择重传需要指定需要重传的字节; 每一个字节都有唯一的32位序号
5. TCP协议的流量控制
流量控制指让发送方发送速率不要太快
流量控制是使用滑动窗口来实现的
例子:发送方发送消息seq=1两次,共发送200字节;接收方发送确认消息,表示还可以发送300字节;
但是消息丢失会引起等待(死锁)--- 但是不会重传怎么办?
坚持定时器:解决上述死锁问题。
当接收到窗口为0的消息,则启动坚持定时器;坚持定时器每隔一段时间发送一个窗口探测报文
6. TCP的拥塞控制机制
一条数据链路经过非常多的设备;数据链路中各个部分都有可能成为网路传输的瓶颈;
网络对硬件设备的性能要求大于可用资源,因此会导致拥塞。
流量控制考虑点对点的通信量的控制;拥塞控制考虑整个网络,是全局性的考虑
报文超时则认为是拥塞;
1)慢启动算法
由小到大逐渐增加发送数据量; 每收到一个报文确认,就加一
2)拥塞避免算法
维护一个拥塞窗口的变量; 只要网络不拥塞,就试探着拥塞窗口调大
7. TCP的建立(三次握手)
(1)第一次握手:连接请求报文,seq=x
(2)第二次握手:接收方 SYN=1连接请求,ACK=1 对序列号确认,ack确认号,希望收到x+1的序列号的值,同时报文也会携带自己的序列号y
(3)第三次握手: 发送方ACK=1 报文的确认号是有用,是y+1希望收到y+1的数据,并且同步自己的序列号为x+1
连接建立之后,还同步了各自的序号。
为什么发送方要发出第三个确认报文呢?已经失效的连接请求报文传送到对方,引起错误
同样的请求会建立两次连接,当需要三次握手时,一旦建立连接,发送方不会对连接方的消息做出回应。
8. TCP连接的释放(四次挥手)
(1)FIN=1需要释放连接
(2)连接请求已收到,并且对消息确认(还可以发送数据)
(3)FIN=1可以释放连接 ACK=1 重复对第一个报文确认
(4)收到释放连接信号,等待一段时间 没有问题,就进入关闭状态。
等待计时器:时长2MSL,
MSL(Max Segment Lifetime): 最长报文段寿命;MSL建议设置为2分钟
为什么需要等待2MSL?
(1)确保发送方的ACK可以到达接收方
(2)最后一个报文没有确认
(3)2MSL时间内没有收到,则接收方会重发
(4) 确保当前连接的所有报文都已经过期
9. 套接字与套接字编程
使用端口(Port)来标记不同的网络进程
端口(Port)使用16比特位表示(0~65535)
套接字(Socket)是抽象概念,表示TCP连接的一端;通过套接字可以进行数据发送或接收
TCP连接由两个套接字组成
10. TCP协议的四个定时器
TCP的四个定时器对TCP协议非常重要,理解TCP的四个定时器对理解TCP协议的原理有非常重要的帮助,以下我们一起来回顾一下TCP的四个定时器。
1)超时定时器
超时定时器也称为超时重传定时器,这个定时器是我们接触的第一个定时器。超时定时器主要应用在TCP的可靠传输协议里面,是为了控制可能发生丢失的报文而设计的定时器,当TCP协议发送端发送一个报文时,就会为该报文设置一个超时定时器。
如果在超时定时器结束之前收到了来自接收端对该报文段的确认。则撤销这个定时器。
如果在超时定时器结束时仍然没有收到来自接收端对该报文段的确认(超时),则认为这个报文可能已经丢弃,发送端重新发送该报文,并重新设置一个超时定时器。
需要注意的是,发送端在超时定时器撤销之前,必须继续缓存已发送未确认的报文,直到发送端收到了来自接收端的确认。
2)坚持定时器
坚持定时器是使用滑动窗口进行流量控制的时候而设置的,这个定时器是我们接触的第二个定时器。要理解坚持定时器,需要理解“零窗口通知”的情况。我们知道接收端通过调整接收窗口的大小可以控制发送端的发送速度,当接收端把接收窗口调小时,那么发送端就会调小发送的流量。
这就可能产生一种情况,就是接收端的缓存区已经满了,这个时候接收端会给发送端发送一个“零窗口”的消息,表示说“当前我已经没有余力处理更多的数据了”,这就是“零窗口通知”的情况。
当出现这种情况的时候,双方都会陷入等待的状态,发送端等待接收端的窗口调大,接收端等待发送端发送的数据。当接收端窗口可以调大的时候,接收端会发送窗口调大的信息给发送端,但是这个消息是不可靠的,也即是这个消息可能会在传输中丢失,并且不会被感知到丢失和重传。
如果这个消息在发送过程中丢失的话,那么发送端和接收端就会进入死锁状态,因为接收端认为“我已经把窗口调大的消息发送出去了,发送端理应发送新的消息才对,所以接收端会一直等待发送端的消息;而发送端因为没有收到窗口调大的消息,则认为“接收端还没有调大窗口,因此我不能发送”,发送端也会一直等待。
因此为了解决这个问题,当发送端收到窗口为零的消息之后,会启动一个坚持定时器来周期性主动的向接收方查询,以便发现窗口是否增大,这个就是坚持定时器的作用。
3)时间等待计时器
时间等待定时器是我们学习的第三个定时器
时间等待计时器(Time-Wait)是由主动关闭TCP连接的一方设置的,当主动关闭TCP连接的一方收到来自对方的FIN报文的时候(第三次挥手),则认为对方也可以关闭TCP连接,这个时候主动关闭TCP连接的一方发送一个消息确认的报文(第四次挥手),并启动这个时间等待计时器,这个计时器会等待2倍MSL的时间,MSL(Max Segment Lifetime),最大报文段寿命。以下为方便讨论,我们把主动关闭的一方称为A,被动关闭的一方称为B。
这个定时器主要是为了正确关闭一个TCP连接而考虑的,这主要是为了保证A在对最后一个FIN报文(第三次挥手)发送确认的报文可以到达B.当A发出这个报文之后,就会启动2MSL计时器,注意,这个报文是有可能在网络传输过程中丢失的,如果B收不到这个确认,那么B会重新发送一次FIN报文,A会重新收到这个报文并重传一次最后的确认,并重新启动2MSL计时器,直到双方正常结束TCP连接。2MSL时间可以保证当B没有收到确认时,B可以再次发出FIN报文,并且A可以再次收到并重新发送确认,所以2MSL的时间可以保证连接正常结束。
4)保活计时器
保活计时器是TCP协议里面的第四个计时器,这个计时器也是课程内容中没有介绍的,因此需要注意这个定时器。
保活计时器,顾名思义,保活是这个计时器的主要目的,他是为了保活TCP连接而设计的,保活定时器可以防止TCP连接的两端出现长时期的空闲,当一方出现状态变化或故障时,另一方没有察觉的情况。
设想连接双方在建立连接后,只传输了一些数据,然后就都保持静默了,双方也都没有关闭连接(这种情况经常存在),如果这个时候其中一方已经故障,那么这个连接将会永远被打开,如果被连接的一方是服务端的话,那将浪费很多服务端的资源。
因此为了解决这个问题,服务端一般都会设置一个保活定时器,每次收到对方的数据则重置这个定时器,如果定时器超时,服务端则发送探测报文段,探测客户端是否还在线,如果没有收到响应的话,那么则认为客户端已经断开连接了,因此服务端也会终止这个连接。
保活定时器其实有很广泛的应用,在今天,很多的分布式系统,都会使用保活定时器来检测其他节点是否在线还是已经故障,或者其他节点也会每隔一段时间向主节点上报心跳信息以证明在线,这些都是保活定时器在更多领域的广泛应用。
面试题
1.传输层主要工作在什么地方?传输层主要工作在终端设备(手机、计算机、笔记本、平板电脑等)上
2、传输层最重要的两个协议是什么?TCP协议和UDP协议。
3.端口是什么,端口有什么作用?端口在协议中一般占用几个字节?端口是为了标记不同的使用网络的进程,端口使用16个比特为表示。
4、UDP协议的中文全称是什么?UDP协议有什么特点?请分点说明。UDP全称是用户数据报协议(User Datagram Protocol),UDP是一个非常简单的传输层协议,他不能保证可靠的交付数据
5.TCP协议的中文全称是什么?TCP协议有什么特点?请分点说明。TCP全称是传输控制协议(Transmission Control Protocol),TCp是面向连接的协议,TCP协议可以提供可靠的数据传输服务。
6.TCP报文头部的序号和确认号都占据4个字节,序号有什么用?确认号呢?序号用于传输数据的编号,在TCP报文中一个字节一个序号。确认号表示期待收到的数据的首字节序号。
7. TCP报文头部的数据偏移字段有什么用?他和TCP报文的结构有什么关系?数据偏移字段表示传输数据偏移TCP首部的距离,如果TCP报文中包含可选数据,则数据偏移字段起作用。
8.TCP报文头部的标记占用6个比特位,每个比特位的值可以为1或0,他们分别有什么意义?6个比特位分别是URG、ACK、PSH、RST、SYN、FIN,URG表示紧急报文、ACK表示确认报文、PSH表示该报文尽快交付应用层、RST表示重置报文,重新建立连接、SYN表示连接请求报文、FIN表示释放连接报文。
9.TCP报文头部的窗口占用2个字节,窗口字段有什么作用?窗口指明允许对方发送的数据量,用于控制TCP连接中数据传输的速率。
10. TCP协议一个重要的特点是可靠传输,可靠传输是怎么实现的?请简要描述可靠传输的基本原理。可靠传输依赖于超时重传,即接收方需要发送确认消息给发送方,如果一定时间内发送方没有收到确认消息,则认为消息没有到达接方,重新发送数据。
11. TCP协议的流量控制和TCP报文头部的什么字段有关系?流量控制具体是怎么工作的?请简要描述流量控制的主要过程。TCP的流量控制和TCP头部的窗口字段有关系,流量控制根据TCP报文中窗口的大小来进行数据的传输,当窗口较大时,增加数据发送速度,当窗口较小时,降低数据发送速度。
12. TCP协议具备拥塞控制的功能,拥塞控制和流量控制有什么区别?拥塞控制是怎么实现的?拥塞控制和流量控制是不一样的,流量控制强调TCP连接双方的发送-接收速率,拥塞控制强调网络环境的状态,TCP连接的发送方可感知网络环境的状态并做出反应。发送端使用慢启动算法、拥塞避免算法、快重传算法、快恢复方法。
13. TCP协议的三次握手是非常重要的知识点,TCP协议的三次握手和TCP报文头部的哪些字段有关系?. 序号、确认号、TCP标记ACK、SYN、FIN。
14.请简述TCP协议三次握手的过程。
15、TCP协议的三次握手是TCP建立可靠通信的基础,请问为什么TCP连接建立的过程叫做三次握手,请陈述三次握手的必要性,两次握手 两次握手不能保证连接正确建立,TCP被连接的一端有可能响应失效的请求报文而无法确认。
为什么不行?
16、TCP协议的四次挥手是非常重要的知识点,TCP协议的四次挥手和TCP报文头部的哪些字段有关系?序号、确认号、TCP标记ACK、SYN、FIN。
17.请简述TCP协议四次挥手的过程,并说明清楚每一次挥手后,双方进入的状态。
18.TCP连接释放的过程中有一个重要概念叫做2MSL,什么是2MSL,它有什么作用?MSL指的是最长报文段寿命(Max Segment Lifetime),2MSL保证ACK报文可以正确到达对方。
19.TCP协议有四个重要的定时器,分别是什么定时器?请简述这些定时器的作用。超时定时器、坚持定时器、时间等待计时器、保活计时器。
20.什么是套接字?你了解套接字的编程吗?请使用套接字实现一个简单的C/S通信工具。套接字是TCP连接双方的IP:端口对。略。