从信息处理得角度上去看,传输层主要是给上面得应用层提供通信服务得。我们平时再对网络进行编程得时候,我们很多时候都是直接对接得传输层,也就是我们使用传输层所提供得接口来进行网络编程,所以我们常说传输层是用户功能得最底层,是面向通信部份得最高层。
传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议)。
UDP(User Datagram Protocol: 用户数据报协议),是一个非常简单的协议,它对接收到的数据报不合并也不拆分,如下图:
UDP协议格式:
16位源端口号 | 16位目的端口号 |
16位UDP长度 | 16位UDP校验和 |
UDP数据 |
UDP协议的特点:UDP是无连接协议;UDP不能保证可靠的交付数据,即UDP协议不会感知网络是否拥塞,UDP协议不管网络是否拥塞,都会把数据交付出去,给这个网络就完了。无法保证数据在网络中是否丢失;UDP是面向报文传输的;UDP没有拥塞控制,而且UDP首部开销很小。
TCP(Transmission Control Protocol: 传输控制协议),是计算机网络中非常复杂的一个协议。
TCP协议特点:TCP是面向连接的协议;TCP的一个连接有两端(点对点通信);TCP提供可靠的传输服务;TCP协议提供全双工的通信;TCP是面向字节流的协议。
TCP协议格式:
16位源端口 | 16位目的端口 | ||||
序号 | |||||
确认号 | |||||
数据偏移 | 保留字段 | TCP标记 | 窗口 | ||
校验和 | 紧急指针 |
TCP选项 | 填充 |
序号:0~ 2 32 2^{32} 232-1,一个字节一个序号, 数据首字节序号
确认号:0~ 2 32 2^{32} 232-1,一个字节一个序号, 期望收到数据的首字节序号。确认号为N:则表示N-1序号的数据都已经收到。
数据偏移:占4位:0~15,单位为:32位字,数据偏离首部的距离。
TCP标记:占6位,每位各有不同意义
标记 | 含义 |
---|---|
URG | Urgent: 紧急位,URG=1,表示紧急数据 |
ACK | Acknowledgement: 确认位,ACK=1,确认号才生效 |
PSH | Push: 推送位,PSH=1,尽快地把数据交付给应用层 |
RST | Reset: 重置位,RST=1,重新建立连接 |
SYN | Synchronization: 同步位,SYN=1 表示连接请求报文 |
FIN | Finish: 终止位,FIN=1 表示释放连接 |
窗口:占16位:0~ 2 16 2^{16} 216-1,窗口指明允许对方发送的数据量
紧急指针:紧急数据(URG=1),指定紧急数据在报文的位置
TCP选项:最多40字节,支持未来的拓展
TCP的可靠传输基于连续ARQ协议,TCP的滑动窗口以字节为单位,窗口滑动过程如下图:
如果接收到的序号没有按序收到确认号,在超时时间内就会进行重新传送,如下图:
为了避免对整个窗口中的字节进行重传,因此TCP协议使用了选择重传来提高传输效率。选择重传:重传的是一段字节流,而不是某个字节,在TCP选项里存储的是需要重传的字节流的边界。选择重传需要指定需要重传的字节,每一个字节都有唯一的32位序号。
流量控制指让发送方发送速率不要太快,是使用滑动窗口来实现的,即通过窗口大小控制对方发送速率。当接收到窗口为0的消息,则启动坚持定时器,坚持定时器每隔一段时间发送一个窗口探测报文。
一条数据链路经过非常多的设备,数据链路中各个部分都有可能成为网路传输的瓶颈。流量控制考虑点对点的通信量的控制,拥塞控制考虑整个网络,是全局性的考虑。如何判断是否发生了网络拥塞?根据报文超时来判断发生了拥塞是不成立的,如果我们在传输的过程中,把光纤或者网络断了,这个时候也会导致报文超时,但这是因为网络故障造成的
慢启动算法: 由小到大逐渐增加发送数据量,每收到一个报文确认,就加一。例如:发送的数据量以此为:1 2 4 8 16…,是指数增长的。当使用慢启动算法增长到慢启动阈值时,就会使用拥塞避免算法;拥塞避免算法:维护一个拥塞窗口的变量,只要网络不拥塞,就试探着拥塞窗口调大,如1 2 4 8 16 17 18 19。
标记 | 含义 |
---|---|
URG | Urgent: 紧急位,URG=1,表示紧急数据 |
ACK | Acknowledgement: 确认位,ACK=1,确认号才生效 |
PSH | Push: 推送位,PSH=1,尽快地把数据交付给应用层 |
RST | Reset: 重置位,RST=1,重新建立连接 |
SYN | Synchronization: 同步位,SYN=1 表示连接请求报文 |
FIN | Finish: 终止位,FIN=1 表示释放连接 |
TCP三次握手的过程:
在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。此后客户端和服务器端进行正常的数据传输。这就是“三次握手”的过程。
为什么发送方要发出第三个确认报文呢?
TCP四次挥手的过程:TCP连接断开过程:假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,“就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。”,Server端收到ACK后,“就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
MSL(Max Segment Lifetime): 最长报文段寿命,MSL建议设置为2分钟。为什么需要等待2MSL?其实在释放连接的过程中,客户端最后一次发送的报文,服务端是没有确认的,为了确保发送方的ACK可以达到接收方,如果2MSL时间内没有收到,则接收方会重发。这也是等待计时器的作用,主要是为了确保发送方发送的第四次挥手报文可以正确的到达接收方,如果没有到达的话,接收方就会重新放松第三次挥手的报文,以正确得到释放这次连接。等待计时器的另一个作用就是确保当前连接的所有报文都已经过期。
为什么关闭连接需要四次挥手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
传输层总结:第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。 传输层的任务是根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间,提供建立、维护和取消传输连接的功能,负责端到端的可靠数据传输。在这一层,信息传送的协议数据单元称为段或报文。 网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口。 有关网络层的重点: