TCP/IP协议之传输层

网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。

传输层协议:TCP UDP

传输层两个协议应用场景

TCP:

  • 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,可靠的流协议;
  • 分段 编号 流量控制 建立会话 (netstat -n);
  • TCP为提供可靠性传输,实行 “顺序控制”、“重发控制”,还具备“流量控制”、“拥塞控制” 等提高网络利用率的功能。

UDP:

  • 用户数据报协议 UDP(User Datagram Protocol)是不具备可靠性的;
  • 一个数据包就能完成数据通信(如DNS),不建立会话,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信;
  • 主要用于那些高速传输和实时性有较高要求的通信或广播通信。

传输层与应用层之间的关系:

  • http = TCP + 80
  • https = TCP + 443
  • ftp = TCP + 21
  • SMTP = TCP + 25
  • POP3 = TCP + 110
  • RDP = TCP + 3389
  • 共享文件夹 = TCP + 445
  • SQL = TCP + 1433
  • DNS = UDP + 53 or TCP + 53

端口号是一个16比特的数,其大小在065535之间,其中01023范围的端口号成为周知端口号。

UDP

UDP只是做了运输协议能够做的最少工作,除了复用/分解功能及少数的差错检验外,它几乎没有对ip增加别的东西。

术语:主机端的UDP为此报文添加首部字段,然后将形成的报文段交给网络层,网络层将此UDP报文段封装进一个ip数据报中,然后将其发送给一个服务器。

有许多应用更适合使用UDP,原因如下:

  • 关于发送什么数据以及何时发送的应用层控制更加精细(UDP没有拥塞控制);
  • 无需建立连接(无时延);
  • 无连接状态(支持更多活跃用户);
  • 分组首部开销小;
  • 使用UDP是可能实现可靠性数据传输的,需要通过应用程序自身中建立可靠性精致来完成。

UDP首部:
enter description here
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。

可靠传输协议

不错、不丢、不乱

rdt1.0

经完全可靠信道的可靠数据传输协议:

  • 不会发生错误(bit error)
  • 不会丢弃分组

enter description here

rdt2.0

经具有比特差错信道的可靠数据传输:只发生位错误,不发生顺序错误。利用校验和检测位错误。

如何从错误中恢复:

  • 确认机制(Acknowledgements, ACK): 接收方显式地告知发送方分组已正确接收;
  • NAK:接收方显式地告知发送方分组有错误;
  • 发送方收到NAK后,重传分组;
  • 基于这种重传机制的rdt协议称为ARQ(Automatic Repeat reQuest)协议。

enter description here

rdt2.1

rdt2.0中,如果ACK/NAK消息发生错误/被破坏(corrupted)如何处理:
如果ACK/NAK坏掉,发送方重传,但不能简单的重传,会产生重复分组。
解决方案为加入序列号(Sequence number): 发送方给每个分组增加序列号,接收方丢弃重复分组。

rdt2.2

与rdt 2.1功能相同,但是只使用ACK,接收方通过ACK告知最后一个被正确接收的分组,发送方收到重复ACK之后,采取与收到NAK消息相同的动作,重传当前分组。

enter description here

rdt3.0

经具有比特差错的丢包信道的可靠数据传输
发送方等待“合理”时间,需要定时器,进行重传
enter description here

Rdt3.0能够正常工作,但性能很差。

滑动窗口协议

允许发送方在收到ACK之前连续发送多个分组,需要:

  • 更大的序列号范围
  • 发送方和/或接收方需要更大的存储空间以缓存分组

enter description here
随着协议的运行,窗口在序列号空间内向前滑动。窗口尺寸为N表示最多有N个等待确认的消息。

GBN

回退N步(Go-Back-N)

累计确认机制:ACK(n): 确认到序列号n(包含n)的分组均已被正确接收,可能收到重复ACK。
为空中的分组设置计时器(timer),超时Timeout(n)事件时,重传序列号大于等于n,还未收到ACK的所有分组

ACK机制: 发送拥有最高序列号的、已被正确接收的分组的ACK。

乱序到达的分组:由于接收方没有缓存,直接丢弃。
enter description here

SR

选择重传(Selective Repeat)

GBN的重传次数过多,SR中接收方对每个分组单独进行确认设置缓存机制,缓存乱序到达的分组,这样发送方只重传那些没收到ACK的分组,为每个分组设置定时器。

enter description here

TCP

  1. 点对点:一个发送方一个接收方;
  2. 可靠的、按序的字节流;
  3. 流水线机制:TCP拥塞控制和流量控制机制设置窗口尺寸;
  4. 发送方和接收方都有缓存;
  5. 双全工:同一连接中能够传输双向数据流;
  6. 面向连接:通信双方在发送数据之前必须建立连接;
  7. 流量控制机制;
  8. 拥塞控制机制。

tcp首部:
enter description here

  • 序号该报文段首字节的字节流编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。

  • 确认号期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。

  • 数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度

  • 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。

  • 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。

  • 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。

  • 窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。

TCP 滑动窗口

窗口允许发送方在收到ACK之前连续发送多个分组,窗口的大小就是指无需等待确认应答而可以继续发送数据的最大值。 窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。


# TCP可靠数据传输 TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务,TCP的差错恢复机制是GBN协议和SR协议的混合体。

重传超时时间间隔

TCP使用单一重传定时器,需要对RTT(Round Trip Time)报文段往返时间进行估计。

TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:


其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。 超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:

其中 RTT d 为偏差的加权平均值。

TCP发送方事件

从应用层收到数据:

  • 创建报文段,序列号是报文段第一个字节的编号
  • 开启计时器
  • 设置超时时间:TimeOutInterval

超时:

  • 重传引起超时的报文段
  • 重启定时器

收到ACK:

  • 累计确认,如果确认此前未确认的报文段,更新滑动窗口SendBase
  • 如果窗口中还有未被确认的分组,重新启动定时器

快速重传机制

TCP的实现中,如果发生超时,超时时间间隔将重新设置,即将超时时间间隔加倍,导致其间隔很大,重发丢失的分组之前要等待很长时间。因此TCP引入快速重传机制,通过重复ACK检测分组丢失,Sender会背靠背地发送多个分组,如果某个分组丢失,可能会引发多个重复的ACK。
快速重传:在定时器超时之前即进行重传

如果sender收到对同一数据的3个ACK,则假定该数据之后的段已经丢失。之所以设置为三次而不是两次的原因是即时报文段的顺序被替换了两次也不会触发重传机制。

TCP 流量控制

流量控制是为了控制发送方发送速率,保证接收方来得及接收,可以让发送端根据接收端的实际接受能力控制发送的数据量

接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

TCP 的三次握手


假设 A 为客户端,B 为服务器端。

  • 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
  • A 向 B 发送连接请求报文(SYN报文段),SYN=1,ACK=0,选择一个初始的序号 x。
  • B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文(SYNACK报文段),SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
  • A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1,SYN比特被置为0。
  • B 收到 A 的确认后,连接建立。

三次握手的原因

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

TCP 的四次挥手


以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。

  • A 发送连接释放报文,FIN=1。
  • B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
  • 当 B 不再需要连接时,发送连接释放报文,FIN=1。
  • A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
  • B 收到 A 的确认后释放连接。

四次挥手的原因:
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

TIME_WAIT:
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

TCP 拥塞控制

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。


TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复

发送方需要维护一个叫做拥塞窗口cwnd(congestion window)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。

为了便于讨论,做如下假设:

  • 接收方有足够大的接收缓存,因此不会发生流量控制;
  • 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。

慢开始与拥塞避免

发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …

注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢启动阈值ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。

如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。

快重传与快恢复

在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。

慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为1,而快恢复 cwnd 设定为 ssthresh。


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP/IP详解·卷2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。《TCP/IP详解·卷2:实现》不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。《TCP/IP详解·卷2:实现》适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 目录 · · · · · · 第一章 概述 1.1 引言 1.2 源代码表示 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 描述符 1.8 网络实现概述 1.9 mbuf与输出处理 1.10 输入处理 1.11 网络实现概述 1.12 中断级别与并发 1.13 源代码组织 1.14 测试网络 1.15 小结 第二章 mduf:存储器缓存 2.1 引言 2.2 代码介绍 2.3 mduf的定义 2.4 mduf结构 2.5 简单的mduf宏和函数 2.6 m_devget和m_pullup函数 2.7 mduf宏和函数的小结 2.8 Net/3联网数据结构小结 2.9 m_copy和簇引用记数 2.10 其他选择 2.11 小结 第三章 接口层 3.1 引言 3.2 代码介绍 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化 3.11 if_attach函数 3.12 ifinit函数 3.13 小结 第四章 接口:以太网 4.1 引言 4.2 代码介绍 4.3 以太网接口 4.4 ioctl系统调用 4.5 小结 第五章 接口:SLIP和环回 5.1 引言 5.2 代码介绍 5.3 SLIP接口 5.4 环回接口 5.5 小结 第六章 IP编址 6.1 引言 6.2 代码介绍 6.3 接口和地址小结 6.4 sockaddr_in结构 6.5 in_ifaddr结构 6.6 地址指派 6.7 接口ioctl处理 6.8 internet实用函数 6.9 ifnet实用函数 6.10 小结 第七章 域和协议 7.1 引言 7.2 代码介绍 7.3 domain结构 7.4 protosw结构 7.5 IP的domain和protosw结构 7.6 pffindproto和pffindtype函数 7.7 pfctlinput函数 7.8 IP初始化 7.9 sysctl系统调用 7.10 小结 第八章 IP:网际协议 8.1 引言 8.2 代码介绍 8.3 IP分组 8.4 输入处理:ipintr函数 8.5 转发:ip_forward函数 8.6 输出处理:ip_output函数 8.7 Internet检验和:in_cksum函数 8.8 setsockopt和getsockopt系统调用 8.9 ip_sysctl函数 8.10 小结 第九章 IP选项处理 9.1 引言 9.2 代码介绍 9.3 选项格式 9.4 ip_dooptions函数 9.5 记录路由选项 9.6 源站和记录路由选项 9.7 时间戳选项 9.8 ip_insertoptions函数 9.9 ip_pcbopts函数 9.10 一些限制 9.11 小结 第十章 IP的分片与重装 10.1 引言 10.2 代码介绍 10.3 分片 10.4 ip_optcopy函数 10.5 重装 10.6 ip_optcopy函数 10.7 ip_slowtimo函数 10.8 小结 第十一章 ICMP:Internet控制报文协议 第十二章 IP多播 第十三章 IGMP:Internet组管理协议 第十四章 IP多播选路 第十五章 插口层 第十六章 插口I/O 第十七章 插口选项 第十八章 Radix树路由表 第十九章 选路请求和选路消息 第二十章 选路接口 第二十一章 ARP:地址解析协议 第二十二章 协议控制块 第二十三章 UDP:用户数据报协议 第二十四章 TCP:传输控制协议 第二十五章 TCP的定时器 第二十六章 TCP输出 第二十七章 TCP的函数 第二十八章 TCP的输入 第二十九章 TCP的输入(续) 第三十章 TCP的用户需求 第三十一章 BPF:BSD分组过滤程序 第三十二章 原始IP 结束语 附录A 部分习题的解答 附录B 源代码的获取 附录C RFC 1122的有关内容 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值