网络知识扫盲:扒开 TCP 的外衣,我看清了 TCP 的本质.docxVIP

网络知识扫盲:扒开 TCP 的外衣,我看清了 TCP 的本质.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络学问扫盲:扒开 TCP 的外衣,我看清了 TCP 的本质 TCP 是 Transmission Control Protocol 的缩写,意思是传输把握协议。一种面对连接的、牢靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。 从这个定义里,有很多初学就首先懵了。 什么是面对连接? 什么是牢靠的通信协议? 什么是面对字节流的? 为了让你对 TCP 有个初步的了解,我打算先从这个定义入手。 什么是面对连接? 面对连接,是相对于另一个传输层协议 UDP 而言的(后面会单独引见)。 TCP 是面对连接的,所以在开头传输数据前要先经受三次握手建立连接。 而 UDP 即刻就可以传输数据,并不需要先三次握手来建立连接。 一个更牢靠,而一个更开放。 就好比,你去医院看病,假如是专家号,一般要提前预定,对只需预定(三次握手建立了连接)上了,你去了就不会看不上病。这是 TCP 。 而假如你没有预定,就直接跑过去,那不好意思,你只能看一般门诊,而一般门诊等的人很多,你就不肯定能看得上病了。这是 UDP。 既然是连接,必定是一对一的,就像绳子的两端。所以 TCP 是一对一发送消息。 而 UDP 协议不需要连接,可以一对一,也可以一对多,也可以多对多发送消息。 什么是牢靠的通信协议? 可不行靠,也是相对于 UDP 而言的。 TCP 本身有三次握手和超时重传等机制,所以无论网络如何变化,次要不是主机宕机等缘由都可以保证一个报文可以到达目标主机。 与之对比, UDP 就比较不担任任了,不管你收不收得到,反正我就无脑发,网络拥堵我也发,它的职责是发出去。 什么是面对字节流的? 与面对字节流相对的是,UDP 的面对报文。 面对报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因而,应用程序必需选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。 面对字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。假如应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。 2. 完整解读 TCP 报文格式 搞懂一个通信协议,了解它的报文格式是必经之路。 TCP 的报文段结构,可以从下面这张图中格外清楚的看到。 TCP 报文首部 接下来,我会一个一个讲解这些字段的内容。 源端口 和 目标端口:各占 2 个字节。2 个字节,也就是 16个 bit,这应当也能说明为什么计算机端口的范围是 1-65535 (0 不使用,2^16=65536,最大位65536不使用)了吧?有了源端口和目标端口,加上 IP 首部里的源IP和目标IP,就可以独一确定一个连接。 序列号:共占用 4个字节。说明序列号的范围是 [0, 2^32-1],也就是 [0, 4294967296]。当序号添加到 4294967296 后,下一个序号将回到0重新开头。在建立连接时由计算机生成的随机数作为其初始值(ISN,即Initial Sequence Number,初始序列号),通过 SYN 包传给接收端主机,每发送一次数据,就累加一次该「数据字节数」的大小(其中要留意的是 SYN 和 FIN 包的 seq 也要消耗一个序号)。用来处理网络包乱序问题。 确认号:共占用 4个字节。说明确认号的范围是 [0, 2^32-1],也就是 [0, 4294967296]。它表示期望收到对方下一次数据的序列号(所以 ack 一般都是上次接收成功的数据字节序号加1),发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来处理不丢包的问题。TCP在接收到数据后 200ms 才会发送ACK包,这种设定是为了等待能否有数据可以一起发送的。 数据偏移:共占 4 个bit,它表示的是TCP报文的数据起始处距离TCP报文起始处的距离有多远。实际生活中我们说距离多远,我们的单位通常是米,而这里距离有多远,单位是 4 个字节(也就是 32bit)。由于 4 个bit,能表示的最大整数是 15,也就说明 TCP 报文里数据开头的位置距离报文起点是 60 个字节(4*15)。这意味着 TCP 的首部(除数据外的都叫首部)长度是 20-60 个字节。 窗口:共占 16 个bit,因而最大的窗口大小为 2^16-1 = 65535 = 64k。这是晚期的设计,对于现在的网络应用,可能会不太够,因而可以在选项里加一个 窗口扩大选

文档评论(0)

duanbingbing + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档