网络层为主机之间提供逻辑通信,应用层为应用进程之间提供端到端的逻辑通信。网络层中,ip数据报首部中的检验和字段,只检验首部中是否出现差错而不检验数据部分。运输层对收到的报文进行差错检测。传输层有两种不同的传输协议,面向连接的tcp和无连接的udp。
udp
udp user datagram protocol 用户数据报协议。传输数据之前不需要先建立连接,远地主机在收到 udp 报文后,不需要给出确认。DNS、TFTP、RIP、DHCP、SNMP、NFS、IP电话、流式多媒体通信等采用的是 udp 传输。
udp 传输特点
- 无连接。发送数据之前不需要建立连接,发送数据结束时没有连接可以释放。
- 尽最大努力交付。不保证可靠交付,主机不需要维持复杂的连接状态表。
- 面向报文。发送方的udp对应用程序交下来的报文,在添加首部后就向下交付ip层。接收方的udp,对ip层交上来的用户数据报,在去除首部后就原封不动交付上层应用进程。
- 没有拥塞控制。网络中出现的拥塞不会使源主机的发送速率降低,适用于实时应用,如 ip电话,实时视频会议,要求源主机以恒定速率发送数据,允许网络拥塞时丢失一些数据,不允许数据有太大时延。
- udp支持一对一,一对多,多对一,多对多。
- udp首部开销小,只有8字节,比tcp的20字节首部要短。
udp 检验
将首部和数据部分一起都检验。udp首部包括:
- 源端口
- 目的端口
- 长度
- 检验和
将12字节伪首部、8字节首部、数据,二进制反码求运算和后,将得出的结果求反码放入检验和字段,接收方将得到的数据报连同伪首部、补0码一起,求16位字的和,无差错时结果应全为 1。
tcp
tcp transmission control protocol传输控制协议,特点是:
- 面向连接的传输层控制协议,使用协议需要之前建立连接,之后释放连接。
- tcp 连接是点对点的。
- tcp 提供可靠交付,无差错、不丢失、不重复、按序到达。
- tcp提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据。
- 面向字节流。字节流是指进程中通信的字节序列。tcp不关心应用进程一次把多长的报文发送到 tcp 的缓存中,而是根据对方给出的窗口值和 当前网络 拥塞程度决定一个报文段应该包含多少字节,udp发送的报文长度是应用进程给出的。
tcp可靠传输工作原理
- ARQ automatic repeat request 自动重传请求
- 流量控制,发送方的 rwnd字段控制
- 拥塞控制,防止过多的数据注入到网络中,可以是网络中的路由器或链路不致过载,是一个全局性过程。流量控制往往值点对点通信量的控制,是端到端的问题。
拥塞控制
- 慢开始
发送方维持一个叫拥塞窗口cwnd(congestion window)的状态变量,发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些。只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
当主机开始发送数据时,如果立即把大量数据字节注入到网络,因为不清楚网络负荷情况,有可能引起网络拥塞。慢开始算法:先进行探测,由小到达逐渐增大拥塞窗口数值。在刚刚开始发送报文段时,先把拥塞窗口设置为一个最大报文段 MSS 值。在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍。
为了防止拥塞窗口 cwnd 增长过大引起网络阻塞,需要设置一个慢开始门限 ssthresh :
-
cwnd < ssthresh,使用慢开始算法
-
cwnd = ssthresh,都可
-
cwnd > ssthresh,停止使用慢开始算法,改用拥塞避免算法
-
拥塞避免
拥塞避免算法主要思路,让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,拥塞窗口 cwnd 按线性规律缓慢增长。
无论在慢开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞,根据就是没有按时收到确认,就要把慢开始门限 ssthresh 设置为出现拥塞时的发送窗口之的一半 (但不能小于2),然后把拥塞窗口 cwnd 重新设置为1,执行慢开始算法。这样可以迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。
- 快重传
在接收方每收到一个失序的报文段后就立即进行重复确认。(前提)快重传算法规定:发送方只要一连收到三个重复确认就应当立即重传对方未收到的报文段,不必继续等待为丢失报文段设置的重传计时器到期。
- 快恢复
发送方连续收到三个重复确认时,将慢开始门限 ssthresh 减半,然后开始执行拥塞避免算法,使拥塞窗口缓慢线性增大。
tcp 建立连接
- A发起连接请求报文段, SYN=1,seq=x
- B发送确认,SYN=1,ACK=1,seq=y,ack=x+1
- A给出确认,ACK=1,seq=x+1,ack=y+1
三次握手的原因:防止已失效的连接请求报文段突然传送到 b,导致产生错误。
tcp连接释放
- A发送连接释放报文段,进入 FIN-WAIT-1,FIN=1,seq=u
- B发出确认,进入 CLOSE-WAIT,ACK=1,seq=v,ack=u+1,A进入 FIN-WAIT-2
- B发送连接释放报文段,进入 LAST-ACK,FIN=1,ACK=1,seq=w,ack=u+1,A进入 TIME-WAIT
- A等待 2MSL(maximum segment lifetime 最长报文段寿命),发出 ACK=1,seq=u+1,ack=w+1,A/B均进入CLOSED
等待2MSL的原因:
- 保证A发送的最后一个ACK报文段能够到达B。B发送释放连接的请求后,如果A发送确认后立即关闭,且该ACK报文段丢失,此时无法收到B的超时重传,也无法重传一次确认。等待2MSL是为了保证这种情况下b的超时重传能够到达a。
- 防止已经已经失效的连接请求报文段出现在下一个连接中,经过2MSL,可以使本连接持续的时间内产生的所有报文段从网络中消失。
网友评论