传输层
1 传输层功能与简介
为什么需要两个不同的独立控制层
- 网络层运行在由运营商ISP操作的路由器上,用户无法控制到这一层
设置一个层位于网络层之上可以让用户控制服务质量 - 传输层原语,是对网络层(网络层由于网络的不同,会有不同的原语)的抽象,提供统一接口(便利,降低开发难度)
传输层的主要功能
传输层是整个协议栈(TCP/IP)的核心,传输层的任务是提供可靠的、高效的数据传输
- 传输服务:(面向连接、面向无连接)
- 在该层还需对字节流进行数据分段(块)和重组
- 保证数据可靠传输和进行流量控制
- 建立端到端的操作;【端点实质是机器上的套接字】
- 从一端主机向另一端主机发送数据段
传输层使整个报文到达了该计算机上正确的进程
传输层的最终目标是向它的用户(应用层)提供高效、可靠和性价比高的服务【例如从一台主机到另一台主机的报文到底送给这台机器的email去解析,还是送给播放器播放,还是浏览器解析】
- 虽然与链路层相似(流控制、差错控制、报文排序),但传输环境不同(传输层-通信子网,链路层-物理信道)
1.1 简单的传输层服务原语:
1.2 传输层的数据传输单元(PDU)是TPDU
2 传输层协议
2.1 UDP
- UDP 是一个无连接的(connectionless)的传输层协议
- 提供端点标识,端到端的数据传输
- 不提供差错检测和可靠传输。但简洁高效
端口(port)定义
16 位,共有 216个端口
端口范围:0~65535
<1023 : 用于公共应用(保留,全局分配,用于标准服务器),IANA分配;
1024~49151 :用户端口,注册端口;
> 49152 : 动态端口,私人端口。
2.1.1 UDP校验和
2.2 TCP(传输控制协议)
TCP (Transmission Control Protocol) 是专门为了在不可靠的互联网络上提供可靠的端到端字节流而设计的
TCP必须动态地适应不同的拓扑、带宽、延迟、分组大小和其它的参数,并且当有错误的时候,能够足够健壮
TCP服务模型:
- 要想获得TCP服务,发送方和接收方必须创建一种称为套接字( sockets )的端点( end points)
- 每个套接字是包含一个IP地址和一个16位的端口( port )
- 通信进程的全球唯一标识
·三元组:协议、本地地址、本地端口号
·五元组:协议、本地地址、本地端口号、远端地址、远端端口号 - 所有的 TCP 连接是全双工的(同时双向传输)和端到端的(每条连接只有两个端点)
- TCP 不支持组播和广播
- TCP连接是字节流而不是消息流
2.2.1 tcp数据段头
- 源端口和 目的端口字段标明了一个连接的两个端点
-
序列号– 字节号 (32 位)
·初始序列号(ISNs) 随机产生
·SYN :携带了ISNs和SYN控制位的数据段 - 确认号 – 期望接收的字节号(32位)
- TCP 段头长度 – TCP段头长度,单位32位
2.2.1.1数据段头解释
保留域/字段
PSH表示这是带有PUSH标志的数据(接收方收到这样的数据,应该立刻送到上层,而不需要缓存它)
RST 被用来重置一个已经混乱的连接
SYN用在连接建立的过程
·当SYN=1,ACK=0, 连接请求
·当SYN=1,ACK=1, 连接接受FIN 被用来释放连接,它表示发送方已经没有数据要传输了,但是可以继续接收数据.
Windowsize – 告诉对方可以发送的数据字节数(从确认字节号开始(决定于接收方))【流控】
Checksum –提供额外的可靠性校验的范围包括头部、数据和概念性的伪头部
TCP头部范围(5x4B15x4B(最大数值))--(20B60B)
2.2.2 TCP建立连接-三次握手
- 一方(server)被动地等待一个进来的连接请求
- 另一方(the client)通过发送连接请求,设置一些参数
- 服务器方回发确认应答
-
应答到达请求方,请求方最后确认,连接建立
- 正常情况下,发送TCP端顺序如a所示
- 两主机同时企图在一对套接字之间建立连接,结果恰好只建立了一个连接,表项为(x,y)
SYN泛洪
`恶意发送SYN段请求服务器的连接,但又故意不完成连接建立的后续服务,以此消耗一台主机的资源。
2.2.3 TCP 连接释放(四次挥手)
释放连接
- 任何一方在没有数据要传送的时候,都可以发送一个FIN置位了的 TCP 数据段
- 当FIN被确认的时候,该方向的连接被关闭
- 当双向连接都关闭了的时候,连接释放
两军队问题
- B2向B1发送今晚十二点一起发起总进攻【合作才能打败白军队】
- B1收到后,不知B2是否会冲下去【因为B2不知道B1是否收到信】,所以发送确认邮件给B2(让其今晚十二点也冲下去)【如果只有B1冲下去肯定失败】
- B2收到邮件,但不知道B1是否知道自己收到邮件【B1如果因为不知道自己是否收到,而不敢冲下去,那自己冲下去也是输】。保险起见,发送给B1【我收到了你的信,咱们今晚一起冲下去】
难题在于最后发送的一方永远无法知道自己的信对方有无收到。
为了避免两军队(two-army)问题,使用定时器
- 如果一方发送了FIN数据段出去却在一个设定的时间没有收到应答,释放连接
- 另一方最终会注意到连接的对方已经不在了,超时后连接释放
半开放连接(half- open)
-
发送者将放弃发送且释放连接,
但是,另外一端却不知道这些情况【初始DR、重传都丢失】,仍然处于活跃的状态 - 杀死半开放连接的方式:如果在一定的时间内,没有TPDUs 到达的话,连接自动释放
·这个TPDU是哑TPDU(dummy TPDU)
TCP是全双工的,连接必须是双向的。半开半闭的连接必须杀掉
2.2.4 TCP滑窗技术与传输策略
TCP 传输策略
发送方(Nagle’s algorithm)
- 尽量不发送数据含量小的数据段
- 缓存应用层的数据,达到一定量再发送
接收方(Clark’s solution)
- 不请求对方发送短数据段(window size)
- 延迟窗口变更信息,使接收缓冲区足够大
2.2.5 TCP拥塞控制
分组守恒:当有一个老的分组离开之后才允许新的分组注入网络
TCP希望通过动态维护窗口大小来实现这个目标
拥塞检测Congestiondetection拥塞标记
所有的互联网TCP算法都假定超时是由拥塞引起的,并且通过监视超时的情况来判断是否出现问题
拥塞控制Congestionprevention
- 当一个连接建立的时候,双方选择一个合适的窗口大小,接收方根据自己的缓冲区大小来指定窗口的大小。
-
如果发送者遵守此窗口大小的限制,则接收端不会出现缓冲区溢出的问题,但可能由于网络内部的拥塞而发生问题
2.2.5.1 决定拥塞窗口大小的算法:
慢启动算法(Slow Start) (尝试的过程):
- 当连接建立的时候,发送者用当前使用的最大数据段长度初始化拥塞窗口,然后发送一个最大的数据段
- 如果在定时器超期之前收到确认,则将拥塞窗口翻倍,然后发送两个数据段。。。。。直至超时(或达到接收方窗口的大小)
- 确定出拥塞窗口的大小
如:如果试图发送 4096 字节没有问题,但是发送8192字节的时候,超时没有收到应答,则拥塞窗口设为4096个字节
2.2.6 定时器的作用
最重要的定时器是重传定时器
持续定时器(persistence timer),用来避免如下的死锁( deadlock )发生
- 接收方发送了一个窗口数为零的确认(窗口更新),告诉发送方等待
- 稍后,接收方空出了缓冲,发送更新窗口的数据段,但是,很不幸,该分组丢失啦!
-
现在,收发双方都在等待对方发送数据段过来,但永远等不到!死锁产生
保活定时器(keep-alive timer)
- 用来检查连接是否存活,当一个连接空闲的时间超过保活定时器的时间,该连接将被杀掉
- 最后一个定时器是在关闭时刻处于TIMED WAIT 状态中使用的定时器,它运行两倍的最大分组生存时间,以确保连接关闭之后,该连接上的所有分组都完全消失
3 TCP UDP比较
TCP
- 可靠传输方式
- 可让应用程序简单化,程序员可以不必进行错误检查、修正等工作
UDP - 为了降低对计算机资源的需求,如DNS
- 应用程序本身已提供数据完整性的检查机制,勿须依赖传输层的协议来保证
- 应用程序传输的并非关键性的数据,如路由器周期性的路由信息交换
- 一对多方式,必须使用UDP(TCP限于一对一的传送),如视频传播