阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

网络协议详解

214次阅读
没有评论

共计 4593 个字符,预计需要花费 12 分钟才能阅读完成。

一、网络概述

自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了

网络协议详解

计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信。网络编程就是如何在程序中实现两台计算机的通信

网络协议详解

用 Python 进行网络编程,就是在 Python 程序本身这个进程内,连接别的服务器进程的通信端口进行通信

网络协议详解

二、TCP/IP 简介

  • 协议

    计算机网络的出现比互联网要早很多

    为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。Internet 是由 inter 和 net 两个单词组合起来的,原意就是连接“网络”的网络,有了 Internet,任何私有网络,只要支持这个协议,就可以联入互联网

    计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple 和 Microsoft 都有各自的网络协议,互不兼容,这就好比一群人有的说英语,有的说中文,有的说德语,说同一种语言的人可以交流,不同的语言之间就不行了

    因为互联网协议包含了上百种协议标准,但是最重要的两个协议是 TCP 和 IP 协议,所以,大家把互联网的协议简称 TCP/IP 协议

网络协议详解

  • IP 协议

    通信的时候,双方必须知道对方的标识,好比发邮件必须知道对方的邮件地址。互联网上每个计算机的唯一标识就是 IP 地址,类似 123.123.123.123。如果一台计算机同时接入到两个或更多的网络,比如路由器,它就会有两个或多个 IP 地址,所以,IP 地址对应的实际上是计算机的网络接口,通常是网卡

    IP 协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过 IP 包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个 IP 包转发出去。IP 包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达

    IP 地址实际上是一个 32 位整数(称为 IPv4),以字符串表示的 IP 地址如 192.168.0.1 实际上是把 32 位整数按 8 位分组后的数字表示,目的是便于阅读

    IPv6 地址实际上是一个 128 位整数,它是目前使用的 IPv4 的升级版,以字符串表示类似于 2001:0db8:85a3:0042:1000:8a2e:0370:7334

  • TCP 协议

    TCP 协议则是建立在 IP 协议之上的。TCP 协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP 协议会通过握手建立连接,然后,对每个 IP 包编号,确保对方按顺序收到,如果包丢掉了,就自动重发

    建立一个 TCP 链接(三次握手)

网络协议详解

断开一个 TCP 链接(四次挥手)

网络协议详解

三、报头结构

  • IPv4 报头结构

网络协议详解

结构 说明
Version(版本) 该字段长度为 4 比特位。标识 IP 报头的版本和格式,ipv4 数据包的该字段设置为:0100
IHL(Internet 报头长度) 该字段长度为 4 比特位。它标识报头的总长度,以 32 比特位为一个单位,在 ipv4 中头部被限制为最多 15 个 32 位字。有效报头的最小值为 5。即 0101
Type of Service(服务类型) 该字段长度为 8 比特位。被分为俩个部分,前 6 位被称为区分服务字段—DS 字段;后 2 位是显示拥塞通知字段—ECN 字段,用于 QS
Total Length(总长度) 该字段长度为 16 比特位。它标识数据报和数据包的总长度,单位为字节。所以 ipv4 的数据最大为 65535
Identification(标识符) 该字段长度为 16 比特位。它标识分段所属的组,所属为同一组则标识符相同。在网络层中也可把流量区分开来,用于流量分片
Flags(标记位) 该字段长度为 3 比特位。它分为三分部分,保留位(reserved bit)为 0;分片位(Don`t fragent)当为 1 时标识未分片,0 则标识被分片;更多位(more fragments)为 0 标识最后分段,为 1 标识更多分段
Fragment Offset(分段偏移) 该字段长度为 13 位比特位。用来重排序,它标识分段在当前数据包的位置,单位为字节
Time to Live(存活时间) 该字段长度为 8 比特位。在网络中标识数据包最大存活时间,用来防止路由环路,每经过一台路由器则 TTL 字段减去 1,直到为 0,此数据包直接被丢弃。其值最大为 255,单位为 s。然而现在路由器转发数据包都是用跳数来作为衡量单位
Protocol(协议) 该字段长度为 8 比特位。它用来标识上层协议(0—255)
Header Checksum(报头校验和) 该字段长度为 16 比特位。这个 16 位字段只对首部查错,不包括数据部分。在每一跳,路由器都要重新计算出的首部检验和并与此字段进行比对,如果不一致,此报文将会被丢弃。重新计算的必要性是因为每一跳的一些首部字段(如 TTL、Flag、Offset 等)都有可能发生变化,不检查数据部分是为了减少工作量。数据区的错误留待上层协议处理——(UDP)和(TCP)都有检验和字段。此处的检验计算方法不使用 CRC
Source address(源地址) 该字段长度为 32 比特位。它标识发送者的 ip 地址
Destination address(目的地址) 该字段长度为 32 比特位。它标识接受者的 ip 地址
options(ip 选项) 该字段长度可变。该字段提供某些控制功能,但在大部分情况下不需要这些功能。里面包括机制有松散路由,严格路由,路由记录及时间戳
padding(填充) 通过 options 字段后面补充 0 来补齐 32 位比特位,padding 的和位 0 或者是 32 的倍数
  • TCP 报头结构

网络协议详解

结构 说明
src port(源端口) 2 个字节,是一个大于 1023 的 16 位数字,由基于 TCP 应用程序的用户进程随机选择
dst por(目的端口) 2 个字节,指明接收者所用的端口号,一般由应用程序来指定
Sequence number(顺序号) 4 个字节,用来标识从 TCP 源端向 TCP 目的端发送的数据字节流,它表示在这个报文段中的 第一个数据字节 的顺序号。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用顺序号对每个字节进行计数。序号是 32bit 的无符号数,** 序号到达 (2^32) - 1 后又从 0 开始。** 当建立一个新的连接时,SYN 标志变 1,顺序号字段包含由这个主机选择的该连接的初始顺序号 ISN(Initial Sequence Number)
Acknowledgement number(确认号) 4 个字节,包含发送确认的一端 所期望收到 的下一个顺序号。因此,确认序号应当是上次已成功收到数据字节顺序号加 1。只有 ACK 标志为 1 时确认序号字段才有效
Offset(报头长度) 4 位,给出报头中 32bit 字的数目。需要这个值是因为任选字段的长度是可变的。这个字段占 4bit,即 TCP 最多有 60(15*4)字节的首部
Resrvd(保留区域) 6 位,保留给将来使用,目前必须置为 0
Control Flags(6 位控制位包括) URG:为 1 表示紧急指针有效,为 0 则忽略紧急指针值
ACK:为 1 表示确认号有效,为 0 表示报文中不包含确认信息,忽略确认号字段
PSH:为 1 表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满
RST:用于复位由于主机崩溃或其他原因而出现错误的连接。它还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下,如果收到一个 RST 为 1 的报文,那么一定发生了某些问题
SYN:同步序号,为 1 表示连接请求,用于建立连接和使顺序号同步(synchronize)
FIN:用于释放连接,为 1 表示发送方已经没有数据发送了,即关闭本方数据流
Window Size(窗口大小) 2 个字节,表示 从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。窗口大小是一个 16bit 字段,因而窗口大小最大为 65535(2^16 – 1)
Checksum(校验和) 2 个字节,对整个的 TCP 报文段 **(包括 TCP 头部和 TCP 数据)**,以 16 位字进行计算所得。这是一个强制性的字段,要求由发送端计算和存储,并由接收端进行验证
Urgent Pointer(紧急指针) 2 个字节,是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。只有当 URG 标志置 1 时紧急指针才有效
Option and Pad(选项和填充) n* 4 字节,常见的可选字段是最长报文大小 MSS(Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是 32 位字的整数倍,所以要加填充位,使得报头长度成为整字数

最大报文段长度 MSS:

指明自己期望对方发送 TCP 报文段时那个数据字段的长度。比如:1460 字节。数据字段的长度加上 TCP 首部的长度才等于整个 TCP 报文段的长度。MSS 不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP 报文段只含有 1 字节数据,在 IP 层传输的数据报的开销至少有 40 字节(包括 TCP 报文段的首部和 IP 数据报的首部)。这样,网络的利用率就不会超过 1 /41。若 TCP 报文段非常长,那么在 IP 层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的 TCP 报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此 MSS 应尽可能大,只要在 IP 层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的 MSS 写入这一字段。MSS 只出现在 SYN 报文中。即:MSS 出现在 SYN= 1 的报文段中

MTU 和 MSS 值的关系:MTU=MSS+IP Header+TCPHeader
通信双方最终的 MSS 值 = 较小 MTU-IP Header-TCP Header

四、UDP 简介

  • 介绍

    用户数据报协议,属于传输层的协议,无连接,不保证传输的可靠性。对于来自应用层的数据包,直接加上 UDP 报头然后传送给 IP。UDP 头部中有一个校验和字段,可用于差错的检测,但是 UDP 是不提供差错纠正的。此外 IPV4 不强制这个校验和字段必须使用,但 IPV6 是强制要求使用的

  • 报头

网络协议详解

结构 说明
源端口 源端口号。在需要对方回信时选用。不需要时可全为0
目的端口 目的端口号。这在终端交付报文时必须要使用到
长度 UDP 数据包的长度 (包括首部和数据),其最小值是 8 (仅有首部)
检验和 检测 UDP 数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算校验和,则直接令该字段全为 0
  • 优势

    特点 说明
    开销更小 TCP 为了保证其可靠性,首部包含 20 字节,以及 40 字节的可选项,UDP 首部只有 8 字节
    速度更快 UDP 发送数据之前没有 TCP 的连接建立过程
    TCP 提供了过多的保护,在及时性上做了很多的妥协,比如:控制微包(Nagle 算法),延时 ACK,流量控制,超时重传等,这些设计严重影响了 Tcp 的速度和及时性
  • 传输过程中存在的主要问题

    问题 说明
    丢失和乱序 因为 UDP 不提供 ACK、序列号等机制,所以是没有办法知道是否有报文丢失以及接收方到达等报文顺序是否和发送方发送的报文数据一样
    差错 对于差错问题则是可以通过校验和等检测到,但是不提供差错纠正
    无法保障数据完整性 UDP 协议头部虽然有 16 位的校验和,但是 IPv4 并不强制执行,也就是说 UDP 无法抱枕数据的完整性

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计4593字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中