网络协议详解

2022-09-08 20:52:18 浏览数 (1)

一、网络概述

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

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

用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:

代码语言:javascript复制
指明自己期望对方发送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无法抱枕数据的完整性

0 人点赞