粉丝232获赞986

本节课我们介绍 tcp 豹纹段的手部格式。在之前的课程中,我们曾介绍过,为了实现可靠传输, tcp 采用了面向自洁流的方式, 也就是将应用进程交付的应用豹纹看作是字节流,并对每个字节进行编号,然后存入发送缓存。 但 tcp 在发送数据时,是从发送缓存中取出一部分或全部字结,并给其添加一个手部,使之成为 tcp 报文段后再进行发送。例如图中所示的这个 tcp 报文段。 一个 tcp 豹纹段由手部和数据载和两部分构成, tcp 的全部功能都体现在他的手部中的各自段 作用。下面我们就来看看 tcp 豹纹段的手部格式。 tcp 豹纹段的手部格式与 ip 数据报的手部格式类似, 都是由二十字节的固定手部和最大四十字节的扩展手部构成。我们首先来看原端口和目的端口自断 原端口字段占十六比特用来写入原端口号,而原端口号用来标识发送该 tcp 报文段的应用进程。 目的端口字段占十六比特用来写入目的端口号,而目的端口号用来标识接收该 tcp 报文段的应用竞争。 我们来举例说明原端口和木地端口的作用。假设主机中的浏览器进程要访问 外部服务器中的外部服务器进程,为了简单起见,我们仅从运输层端口号这个角度来举例,而不考虑其他细节,例如 arep 域名解析、 tcp 连接建立等。 当在浏览器地址栏中输入了外部福气的域名后,浏览器会构建一个封装有 http 请求豹纹的 tcp 豹纹段, 该豹纹段手部中的原端口字段会填写一个短暂端口号,例如,四九幺五二,用来标识发送该 tcp 豹纹段的浏览器进程, 目的端口字段会填写八零这个熟知端口,因为使用 http 协议的外部服务器进程默认监听该端口,外部服务器 收到该 tcp 豹纹段后,从中提取出 http 请求豹纹,并根据豹纹段手部中的目的端口字段的值八零,将 http 请求豹纹上交给外部服务器进程。 外部服务器进程根据 htdp 请求豹纹的内容进行相应处理,并构建 htdp 响应豹纹。 htvp 响应豹纹需要封装成 tcp 豹纹段进行发送,该 tcp 豹纹段手部中的原端口字段会填写八零这个熟知端口用来标识发送该 tcp 豹纹段的外部服务器进程, 而目的端口字段会填写四九幺五二,这是主机中需要接收该 tcp 报文段的浏览器进程所对应的端口号。 主机收到该 tcp 豹纹段后,从中提取出 http 响应豹纹,并根据豹纹段手部中的目的端口字段的值四九幺五二,将 htdp 响应豹纹上交给浏览器进程, 浏览器进程对 hddp 响应豹纹的内容进行解析并显示。接下来我们再来看看与 tcp 实现可靠传述相关的序号字段。确认号字段以及确认标志为 ack 序号字段占三十二比特,因此取决范围是零到二的三十二次减一, 当序号增加到最后一个后,下一个序号就又回到零。序号字段的值用来指出本 tcp 报文段数据载合的第一个字节的序号。 例如,这是一个 tcp 报文段,它由首部和数据载和两部分构成。 数据载合中的每个字节数据都有序号,如图所示。请注意他们是字节数据的序号,而不是内容。对于该例子,手部中的序号字段应填入的实禁制值为幺六六,用来指出数据载合的第一个字节的序号为幺六六。 确认号自断占三十二比特,因此取值范围是零到二百三十二次减一,当确认号增加到最后一个后,下一个确认号就又回到零。 确认号自断的值用来指出期望收到对方下一个 tcp 报文段的数据载和的第一个字节的序号, 同时也是对之前收到的所有数据的确认。可以这样理解,若确认号等于 n, 则表明到序号 n 减一为止的所有数据都已正确接收,期望接收序号为 n 的数据, 只有当确认标志为 ack, 取之为一时,确认号字段才有效。取之为零时,确认号字段无效。 tcp 规定在连接建立后,所有传送的 tcp 报文段都必须把 ack 制一。 下面我们来举例说明这三个字段的作用。主题 a 发送一个 tcp 豹纹段,该豹纹段手部中的序号字段的取值为二零幺,这表示该 tcp 豹纹段数据 载合的第一个字节的序号为二零一。假设数据载合的长度为一百字节,手部中的确认标志为 ack, 取之为一,这表示确认号字段有效。 确认号自断的取值为八百,这要表示主机 a 收到了主机 b 发来的序号到七九九为止的所有数据,现在期望收到序号从八百开始的数据, 主机 b 收到后,也给主机 a 发送 tcp 豹纹段,该豹纹段手部中的序号字段的取值为八百,这表示该 tcp 豹纹段数据载合的第一个字节的序号为八百, 这正好与主机 a 的确认相匹配。假设数据载合的长度为两百字结手部中的确认标志为 ack, 取之 为一,这表示确认号字段有效确认号字段的取值为三零一,这表示主机币收到了主机 a 发来的序号到三百为止的所有数据,现在期望收到序号从三零一开始的数据。 我们再来看看数据偏移字段,该字段占四比克,并以四字结为单位。 数据偏移用来指出 tcp 豹纹段的数据载和部分的起始处距离 tcp 豹纹段的起始处有多远。该自断实际上指出了 tcp 豹纹段的手部长度, 手部固定长度为二十字节,因此数据偏移字段的最小值为二经济形式的零幺零幺,加上最大四十字节扩展,手部 首部最大长度为六十字节,数据偏移字段应取最大值为二进制形式的幺幺幺幺。 我们来举例说明。假设这个 tcp 豹纹段手部中的数据偏移字段的取值为二进制的零幺零幺, 那么手部长度为二十字结,因为二进制的零幺零幺转换成十进制是五,而该字段以四字结为单位,因此五乘以四字结等于二十字结。 假设这个 tcp 豹纹段手部中的偏移字段的取之为二进制的幺幺幺幺,那么手部长度为六十字节, 因为二进制的幺幺幺幺转换成实进制是十五,而该字段以四字结为单位, 因此十五乘以四字结等于六十字结。 tcp 豹纹段手部中的保留字段占六比特,保留为今后使用,目前应至为零。 我们再来看看窗口字段,该字段占十六比特,以字结为单位。该字段指出的是发送本报文段的一方的接收窗口, 窗口值作为接收方让发送方设置其发送窗口的依据。这是以接收方的接收能力来控制发送方的发送能力,也就是所谓的流量控制。 需要注意的是,发送窗口的大小还取决于拥塞窗口的大小,也就是应该从接收窗口和拥塞窗口中取小者。 tcp 豹纹段手部中的教练盒子段占十六比特,用来检查整个 tcp 豹纹段在传输过程中是否出现了误码。 与 udp 类似,在计算教验核实,要在 tcp 豹纹段的前面加上十二字节的为首部 具体的教研算法就不再坠数了,因为它仅仅是一种教研算法,与 tcp 的其他中药功能相比,教研算法并不是重点。当然,如果您有兴趣,可以自行查阅。接下来我们来看同步标志位 syn, 该标志位在 tcp 连接建立时用来同步序号。我们来举例说明,主机 a 和主机 b 要基于 tcp 进行 数据传说,首先要建立 tcp 连接,也就是使用三豹纹握手来建立连接。假设纵坐标为时间,主机 a 发送 tcp 连接请求豹纹段, 该豹纹段不能携带数据,仅有手部,手部中的同步标志位 syn 取之为一,用来表示这是一个 tcp 连接请求豹纹段序号字段取之为 x, 这是主题 a 中的 tcp 进程为自己挑选的初始序号。 主机 b 收到 tcp 连接请求豹纹段后,给主机 a 发送 tcp 连接请求确认豹纹段, 该报文段也不能携带数据,仅有首部,首部中的同步标志为 s、 y、 n 和确 标志位 ack 都取之为一,用来表示这是一个 tcp 连接请求确认保温段, 序号字段取之为外,这是主机币中的 tcp 进程为自己挑选的初始序号确认号字段的取置为 x 加一,这是对所收到的 tcp 连接请求豹纹段的确认。 主机 a 收到 tcp 连接请求确认报文段后,还要针对该报文段给主机 b 发送一个普通的 tcp 确认报文段。普通的 tcp 确认报文段可以携带数据,也可以不携带数据,如果不携带数据,则不消耗序号。 该豹纹段手部中的确认标志位 ack 取之为一,用来表示这是一个普通的 tcp 确认豹纹段。 序号字段取之为 x 加一,这是因为这是主机 a 发送的第二个 tcp 豹纹段, 主机 a 发送的第一个 tcb, 豹纹段的序号为 x, 且不携带数据,因此本豹纹段的序号为 x 加一, 确认号字段取之为外加一,这是对所收到的 tcp 连接请求确认豹纹段的确认。再来看看中指标注为 fin, 该标志位用来释放 tcp 连接。假设主机 a 和主机 b 基于 tcp 的通信已经完成,可以使用四、豹纹挥手来释放连接 主机 a 发送 tcp 连接释放豹纹段,该豹纹段手部中的中指标志位 fin 和确认 标志为 ack, 取之都为一,用来表示这是一个 tcp 连接释放豹纹段,并对之前所收到的数据进行确认,序号字段的取之为优, 他等于之前已发送过的数据的最后一个字节的序号加一,确认号字段的取值为微,他等于之前已接收到的数据的最后一个字节的序号加一。 主机 b 收到 tcp 连接释放豹纹段后,给主机 a 发送普通的 tcp 确认豹纹段, 其手部中的确认标志位取之为一,用来表示这是一个普通的 tcp 确认豹纹段。 序号字段取值为微,确认号字段取值为 u。 加一,这是对所收到的 tcp 连接释放豹纹段 确认主机 b 如果还有数据要传说,可以继续传说主机 a 仍要接收。 当主机 b 没有数据要传输时,可以给主机 a 发送 tcp 连接释放豹纹段,该豹纹段手部中的中指标志位 fin 和确认标志位 ack 取值都为一, 用来表示这是一个 tcp 连接释放豹纹段,并对之前收到的数据进行确认。 序号字段的取值为 w, 确认号字段的取值为 u。 加一。主题 a 收到 tcp 连接释放豹纹段后, 还要针对该报文段给主机币发送一个普通的 tcp 确认报文段,其手部中的确认为为一,用来表 是,这是一个普通的 tcp 确认豹纹段,序号字段取之为 u 加一,确认号字段取之为 w。 加一,这是对所收到的 tcp 连接释放豹纹段的确认。 手部中的复位标志位 rst 用来复位 tcp 连接。 当 rst 等于一时,表明 tcp 连接出现了异常,必须释放连接,然后再重新建立连接。 rst 至一,还可以用来拒绝一个非法的爆文段或拒绝打开一个 tcp 连接 手部中的推送标志位 psh 用来实现推送操作。也就是说,当接收方的 tcp 收到该标志位 为一的 tcp 报文段,会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付 手。部中的紧急标志位 u、 r、 g 和紧急指针字段用来实现紧急操作。紧急标志位取之为一时,紧急指针字段有效,取之为零时,紧急指针字段无效。 紧急指针自断占十六比特,以字结为单位,用来指明紧急数据的长度。 当发送方有紧急数据时,可将紧急数据插对到发送缓存的最前面, 并立刻封装到一个 tcp 豹纹段中进行发送。紧急指针会指出本豹纹段数据载和部分包含了多长 到紧急数据,紧急数据之后是普通数据。接收方收到紧急标志位为一的 tcp 报文段, 会按照紧急指针自断的值,从报文段数据载和部分取出紧急数据,并直接上交应用进程,而不必在接收缓存中排队。 tcp 豹纹段首部除了二十字节的固定部分,还有最大四十字节的选项。部分 增加选项可以增加 tcp 的功能。目前有以下选项,最大豹纹段长度。 mss 选项,他用来指出 tcp 豹纹段数据载和部分的最大长度。 窗口扩大选项用来扩大窗口以提高吞吐率。时间戳选项 有以下两个功能,一个是用来计算往返时间 rtt, 另一个是用来处理序号抄范围的情况,又称为防止序号扰回。选择确认选项用来实现选择确认功能。 我们对这些 tcp 扩展功能不再深入介绍,这也超出了本课程的教学要求。 由于选项的长度可变,因此还需要使用填充来确保豹纹段手部能被四整除。 这是因为数据偏移字段,也就是手部长度字段是以四字结为单位的。 例如,如果使用了最大豹纹段长度 mss 选项,该选项占三字节,那么就需要使用一字节的 填充,使得 tcp 豹纹段手部长度为二十四字结,能背四整除。 本节课到这里就结束了,希望您已经掌握了 tcp 豹纹段手部中的这些比较重要的字段和标志位的作用,期待您的参与,下节课见!

tcp 的连接其实和打电话是一样的。 sky, 有空一起爬个山啊。可以啊,难得度啥时候?嗯,明天早上吧,我带着相机去山顶给你拍张照。 你看,这就是一个 tcp 的连接,通过几个简单的来回建立一个 tcp 的一个连接。在看具体的一个连接过程之前,我们需要了解一些前置知识。首先这是 tcp 的一个豹纹头,我们要关注的几个点,第一, circles number。 由于 tcp 的可靠连接,所以 tcp 会为字节流动的每一个字节都会加上一个编号,而本次端的 这值就代表着说我们本次发送数据的第一个字节的序号。例如我们现在的序号为零,就代表着我们第一个要发送的字节编号为零。如果我们的数据长度为十,那么此报文的编号就为零到九 a、 c、 k 确认号。确认号表示以正确接收的序号为 n, 要求发送端下一个应该发送的序号为 n 加一。例如我们现在接收到的 a、 c、 k 的确认号为 十,就代表说前十个及零到九编号的字节都已经全部接收到了,下一个直接从编号十开始发送即可。 最后还有两个参数,第一个 ack 即确认标志位为唯一时,表示确认好有效。第二个 syn 表示当次段唯一时,这是一个连接请求或者连接接受 bo。 有了些潜质知识,我们就可以了解一下三次握手的一个详细过程。第一次握手,客户端将 s one 值唯一产生一个随机巡航 x, 并将该数据包发送给我们服务端,此时我们客户端就进入了一个 set 状态。第二次握手,当服务端收到数据包后, 由标志位 s、 y、 n 等于一知道客户端想要请求的建立连接,服务端将标志位 s、 y、 n 和 a、 c、 k 都值为一,确认号为 x 加一,表示对客户端 x 的确认。同样,服务端也会产生一个随机值 y, 并将该数据包发送给我们的客户端,以确认连接请求。第三次握手, 客户端再进行一次确认,将 a、 c、 k 只为一,续号只为 x 加一, a、 c、 k 只为 y 加一,表示对我们服务端续航 y 的确认。此时客户端便进入了一个 establish 的状态,服务端收到报文后,也会进入一个 establish 的状态,经过三次握手,双方便可以进行通信。 我们把这个过程说的再简单一点,就是客户端向服务器发送报文,表示自己想要进行连接,并且发送的随机序号为一百。当服务器接收到之后,会告诉客户端已经准备好接收序号幺零幺的信息,同时发送一个自己的随机序号为两百。 客户端收到之后也会告诉服务器一个确认报告呢,告诉对方司机已经准备好接收需要为二零幺的一个信息。那为什么需要三次握手而不是两次呢?首先,我们必须要保证通信双方都有能力发送信息,并且接受响应。第一次,当客户端发送给服务器时,服务器知道了客户端的发送是正常的,服务器的接收也是 正常的。第二次,当服务器发送给客户端,说明客户端知道了自己的发送和接收都是正常的,也说明客户端知道了服务器的发送和接收都是正常的。第三次当客户端再发送给服务器的确认报文的时候,服务器就可以知道了自己的发送是正常的,同时客户端的接收也是正常的。


尚未及开发通信应该算是最难的,不同协议的 prc 之间进行数据交换确实是件头痛的事情, 好在现在 prc 绝大多数都支持摩托巴士通讯,我们可以将不同协议的 prc 统一转换成摩托巴士 tcp 协议,通过一台摩托巴士服务器,然后提供给主态界面以及其他的一些上文机软件来访问。首先我们点开这个摩托巴士服务器配置, 点击添加,把你公共机的 ip 地址填到这里, 短口号摸 五零二三维基主态界面以及其他的三维基软件都可以同时访问这个 app 地址和端口号,不会像其他的 prc 软件一样,只可以同时访问一个端口号。添 加账号和数据块,点击添加数据块,总共是三十二个,意思就是有三十二个设备,数据块可以理解成摩托巴士的重粘设备。有多少个账号我们这里就使用。一,我们可以在相同 ip 地址统一端口下添加 n 个数据块和账号, 我们这里就使用一个点击确定再确定,然后点击通讯配置,我们这里添加三个 prc, 第一个我们就去连刚才我们配置的那个摩托巴士服务器,虽然他在同一个软件上,在主态界面上我们仍然也是可以访问他的,同 时还可以提供给其他的上危机访问。点击双击这个地方就填摩托巴士服务器的 ip, 我们这里使用直接地址点击确定。 另外一台我们选用松下的 prc 协议幺幺,还有一个选择西门子的 s t 协议, ip 地址改成五零好,这里就有了三个连接,一个是摩托巴士服务器的连接, 还有另外两个是 prc 的连接,我们这里是通过访问第一个连接 modelis 服务器的连接,然后通过他间接的访问另外两台 prc 的数据。先点击确定, 点击协议网关啊,这里面是我已经添加好的,我们看一下。左边是第一个连接的 prc 数据继承器的第一个地址绑定的是第二台设备的松下的 prc 的低七零,然后另外一个数据继承器的地址是访问的西门子 prc 的 db 一点零,这个设备边 号应该改成二, 这是第三的一个连接,这个地方我不详细讲解,大家可以去看,上一节课。好,先关闭它,然后从工具箱里面拿出一个数据显示器监控地址,填第一个数据计算器的地址, 然后复制一份,这个是第二个数据计算器的地址。 下面我们只要访问这两个地址,就能分别访问两台 prc 的数据。我们先启动运行。好,现在看一下。上面是松下的 prc 编程软件,下面是西门子 prc 的编程软件, 我们现在修改第一个 prc 地址的值。好,从下 prc 这边改, 我再修改另外一个。好,西门子这边改变了,这样我们就实现了通过一台摩托巴士服务器来访问不同协议的 prc。