基于tcp的服务器客户端程序设计(编辑修改稿)内容摘要:

都置 1,确认号是 ack=x+1,同时也为自己选择一个初始序号 seq=y。 这个报文段也不能携带数据,但同样要消耗掉一个序号。 这时 TCP 服务器进程进入 SYNRCVD 状 态。 TCP 客户进程收到 B 的确认后,还要向 B 给出确认。 确认报文段的 ACK 置1,确认号 ack=y+1,而自己的序号 seq=x+1, ACK 报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。 这时, TCP 连接已经建立, A 进入 ESTABLISHED 状态。 当 B 收到 A确认后,也进入 ESTABLISHED 状态,这个过程就是三次握手。 数据传输结束后,通信双方都可释放连接。 现在 A 和 B 都处 ESTABLISHED状态。 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送 数据,主动关闭 TCP连接。 A把连接释放报文段首部的终止控制位 FIN置 1,其序号 seq=u,它等于前面已传送过的数据的最后的一个字节的序号加 1。 这时 A 进入FINWAIT1 状态,等待 B 的确认。 FIN 报文段即使不携带数据,它也消耗掉一个序号。 B 收到连接释放报文段后即发出确认,确认号是 ack=u+1,而这个报文段自己的序号是 v,等于 B 前面已传送过的数据的最后一个字节的序号加 1。 然后 B就进入 CLOSEWAIT 状态。 TCP 服务器进程这时应停止高层应用进程,因而从 7 A 到 B 这个方向的连接就释放了,这时的 TCP 连接处于 半关闭状态,即 A 已经没有数据要发送了,但 B 若发送数据, A 仍要接收。 也就是说,从 B 到 A 这个方向的连接并为关闭,这个状态可能会持续一些时间。 A 收到来自 B 的确认后,就进入 FINWAIT2 状态,等待 B 发出的连接释放报文段。 若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。 这时B 发出的连接释放报文段必须使 FIN=1。 假定 B 的序号为 w, B 还必须重复上次已发送过的确认号 ack=u+1。 这是 B 就进入 LASTACK 状态,等待 A 的确认。 A 在收到 B 的连接释放报文段后,必须对此发出确认。 在确认报文段中把ACK 置 1,确认号 ack=w+1,而自己的序号是 seq=u+1。 然后进入到 TIMEWAIT状态。 要经过 4 分钟才能进入到 CLOSED 状态,才能开始建立下一个新的连接,当 A 撤销相应的传输控制块 TCB 后,就结束了这次的 TCP 连接。 这个过程就是TCP 连接释放过程的四次握手。 TCP 的连接释放采用四次握手机制。 任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后就进入半关闭状态。 当另一方也没有数据再发送时,则发送连接通知,对方确认后就完全关闭了 TCP 连接。 如下图所示。 客户 A 服务器 B ESTABLISHED FIN WAIT1 FIN WAIT2 TIME WAIT CLOSED ESTABLISHED CLOSE WAIT LAST ACK CLOSED 主动 被动 数据传送 8 TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。 一个 TCP报文段分为首部和数据两部分,而 TCP 的全部功能都体现在它的首部中各字段的作用。 因此,只有弄清 TCP 首部各字段的作用才能掌握 TCP 的工作原理。 TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项。 因此 TCP 首部的最小长度是 20 字节。 如下图所示。 对于 TCP 报文段中的序号部分,它是占了 4 字节, TCP 是面向字节流的,在下一个 TCP 连接中传送的字节流 中的每一个字节都按顺序编号,整个要传送的字节流的起始序号必须在连接建立时设置。 首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。 例如,一报文段的序号字段值是 301,而携带的数据共有 100 字节。 这就表明:本报文段的数据的第一个字节的序号是 301,最后一个字节的序号是 400。 显然,下一个报文段的数据序号应该从 401 开始。 对于确认号,是占 4 个字节,是期望收到对方下一个报文段的第一个数据字节的序号。 例如, B 正确收到了 A 发送过来的一个报文段,其序号字段值是 501,而数据长度是 200 字节,这表明 B 正确 收到了 A 发送的到序号 700 为止的数据。 因此, B 期望收到 A 的下一个数据序号是 701,于是 B 在发送给 A 的确认报文段中把确认号置为 701。 还有一个比较重要的部分就是校验和。 是占 2 个字节,校验和字段检验的范围包括首部和数据这两部分。 在计算校验和时,要在 TCP 报文段的前面加上 12 9 字节的伪首部。 伪首部的格式与 UDP 用户数据报的伪首部一样。 但应把伪首部第4 个字段中的 17 改为 6,把第 5 字段中的 UDP 长度改为 TCP 长度,接收方收到此报文段后,仍要加上这个伪首部来计算校验和。 TCP 可靠传输的实现是已字节为单位的滑动窗口。 发 送窗口是根据接收窗口设置的,但在同一时刻,发送窗口并不总是和接受窗口一样大。 这是因为通。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。