计算机网络
欢迎关注公众号二月鸟的博客。
1、协议体系介绍
1.1 五层协议
- 应用层 :为特定应用程序提供数据传输服务,例如 HTTP、DNS 等。数据单位为报文。
- 传输层 :为进程提供通用数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:传输控制协议 TCP,提供面向连接、可靠的数据传输服务,数据单位为报文段;用户数据报协议 UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。TCP 主要提供完整性服务,UDP 主要提供及时性服务。
- 网络层 :为主机提供数据传输服务。而传输层协议是为主机中的进程提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组。
- 数据链路层 :网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧。
- 物理层 :考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。
1.2 OSI
其中表示层和会话层用途如下:
表示层 :数据压缩、加密以及数据描述,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。
会话层 :建立及管理会话。
五层协议没有表示层和会话层,而是将这些功能留给应用程序开发者处理。
1.3 TCP/IP
它只有四层,相当于五层协议中数据链路层和物理层合并为网络接口层。
TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。
1.4 各层协议/及应用层协议详解
各层协议汇总:
OSI层 | 功能 | 协议 |
---|---|---|
应用层 Application layer | 各种应用,如文件传输、电子邮件、虚拟终端等应用 | TFTP、HTTP、SNMP、FTP、DNS、SMTP、TELNET、POP3、IMAP、DHCP |
表示层 Presentation layer | 数据格式化、代码转换、数据加密、数据翻译、压缩 | JPEG、MPEG、ASII |
会话层 Session layer | 解除或建立与其他节点的联系 | RPC、NFS、SQL |
传输层 Transport layer | 提供端对端的接口 | TCP、UDP、SPX |
网络层 Network layer | 对数据包选择路由 | IP、ICMP、RIP、BGP、IGMP、OSPF、ARP、RARP |
数据链路层层 Data Link layer | 传输有地址的帧,错误检测功能 | SLIP、CSLIP、PPP、MTU、MAC、VLAN、FR |
物理层 Physical layer | 以二进制数据形式在物理媒体上传输数据 | ISO2110、IEEE802、IEEE802.2、CLOCK |
ARP和RARP 是网络层的协议,但是它所工作的内容是链路层的。具体来说应该是在网络层。
下面是应用层协议
应用 | 应用层协议 | 端口号 | 传输层协议 | 备注 |
---|---|---|---|---|
域名解析 | DNS | 53 | UDP/TCP | 长度超过 512 字节时使用 TCP |
动态主机配置协议 | DHCP | 67/68 | UDP | |
简单网络管理协议 | SNMP | 161/162 | UDP | |
文件传送协议 | FTP | 20/21 | TCP | 控制连接 21,数据连接 20 |
远程终端协议 | TELNET | 23 | TCP | |
超文本传送协议 | HTTP | 80 | TCP | |
简单邮件传送协议 | SMTP | 25 | TCP | |
邮件读取协议 | POP3 | 110 | TCP | |
网际报文存取协议 | IMAP | 143 | TCP |
2、 数据在各层的传递关系
拆解图中数据包:
- 数据是用户真正看到的数据
- H5 是用来给对应的应用层进行解析的首部数据
- H4 是运输层协议对应用层的数据包信息补充的首部,比如会在首部中添加端口号等信息,不同的协议,首部长度也会有区别。
- H3 是网络层协议对传输层的数据包信息补充的首部,比如 IP 协议会在首部中放入机器的IP地址。
- H2 是数据链路层对网络层的数据包信息补充的首部,比如,在首部添加机器的MAC地址。
最底层就是数据包在物理层的传输方式——比特流,这一层主要是负责传送0和1的电信号构成的比特流。
整体数据包结构如图(传输协议使用TCP、网络协议采用IP):
2.1 应用层数据包
应用层是距离用户最近的一层,主机上的一个个进程构成了应用层,应用层的数据包是具体应用规定的应用程序的数据格式。
如 HTTP 数据包规定的数据格式: 请求行、请求头、空白行、请求体。
2.2 传输层数据包
端口(0-65535):每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。0到1023的端口通常被系统占用,用户最好选用大于1023的端口。
"传输层"的功能,就是建立"端口到端口"的通信。相比之下,“网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字”(socket)。有了它,就可以进行网络应用程序开发了。
传输层的主要协议是 TCP 和 UDP 协议。
TCP协议的数据首部信息:
- 源端口号:数据报来源主机的端口号。
- 目的端口号:数据报目的主机的端口号。
源IP地址,目的IP地址,源端口号,目的端口号这四个字段唯一的确定了一个TCP链接。 - TCP序号(seq):发送的TCP的序号,从0开始,实际中这个值就是发送的数据报中内容的字节数,比如我发送的第一个报中sq=0,数据报内容20字节,那么下一个数据报的sq就应该是21。
- 捎带的确认(ack):确认收到上一个数据报,然后act的值是指定自己想要收到的下一个数据报的sq,比如我收到一个数据报的sq=0,数据报内容20字节,那么我的ack就应该是21,用来标明我sq=0,内容为20字节的数据报已经收到,我接下来期望收到的是sq=21的数据报。
- 首部长度:和IP头部的长度域类似,这个域用来标明TCP头部的长度,单位也是字。
- 保留:6bit未使用的域
- Flag:从左到右,[URG|ACK|PSH|RST|SYN|FIN]
- ACK 设置为1表示前面的确认(ack)是有效的,否则前面的确认应被忽略。
- PSH 表示要求对方在接到数据后立即请求递交给应用程序,而不是缓冲起来直到缓冲区收满为止。
- RST 用于重置一个已经混乱的连接。
- SYN 用于建立连接的过程。在链接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域。链接应答则捎带了一个确认,即SYN=1和ACK=1.本质上SYN位是用来表示CONNECTION
REQUEST和CONNECTION ACCEPTED,然后进一步用ACK来区分是请求还是应答,的确很高明。 - FIN 用来释放一个连接。它表示发送方已经没有数据要传输了。然后,在关闭一个连接后,关闭进程可能会在一段不确定的时间内继续接收到数据。SYN和FIN数据段都有TCP序号,从而保证了这两种数据段被按照正确的顺序来进行处理。
- 窗口大小:指定了从被确认的字节算起可以发送多少个字节。要深入理解这个域的含义,可以参看TCP用色控制和慢启动算法
- 校验和:校验范围包括TCP头、数据报内容和概念性伪头部。概念性伪头部又包括源IP,目的IP,TCP协议号。
- 紧急指针:指向数据报中紧急数据最后一个字节的下一个字节。
因为 TCP 包的首部要占用20字节,所以这的MTU为1480 -20 = 1460 字节
UDP 协议数据包首部信息:
- 源端口号: 表示发送端端口号,字段长16位。该字段是可选项,有时可能不会设置源端口号。没有源端口号的时候该字段的值设置为0。可用于不需要返回的通信中。 占 2 个字节
- 目标端口号: 表示接收端端口号,字段长度16位,占 2 个字节
- 包长度: 该字段保存了UDP首部的长度跟数据的长度之和。占 2 个字节。
- 校验和: 校验和是为了提供可靠的UDP首部和数据而设计。在计算校验和时,如图所示,附加在UDP伪首部与UDP数据报之前。通过在最后一位增加一个“0”将全长增加16倍。此时将UDP首部的校验和字段设置位“0”。然后以16比特为单位进行1的补码和,并将所得到的1的补码和写入校验和字段。 占 2 个字节。
因为 UDP 包的首部要占用8字节,所以这的MTU为1480 -8 = 1472 字节
2.3 网络层数据包
IP 包头格式:
- 版本:记录数据报属于哪一个版本的协议,如IPv4或IPv6
- 首部长度:指明IP头部长度,它指明的是首部占32bit的数目,(即单位为4Byte)。该域的值最小为5,就是标准的头部长度;最大为15,表明有扩展部分。
- 服务类型:用来区分不同服务的需要
- 数据报总长:包含IP头部的数据报的总长度。注意,这里不包括链路层的头部,目前最大值是65535字节。
- 分组ID:这个域的作用是当一个大的数据报被拆分时,拆分成的小的数据段的这个域都是一样的。
- 标记:共三个bit,第一个未使用;第二个DF(Don’t Fragment),设置成1表示这个数据包不能被分割,这个是针对路由器的一条指令;第三个MF(MoreFragment),如果一个数据包被分割了,那么除了最后一个分段以外的所有分段都必须设置为1,用来表示后面还有更多的分段没有到达,最后一个设置为0,用来表示分割的段全部到达。
- 段偏移量:这个域有13bit,也就是每一个数据报最多有8192个分段。每一个分段的长度必须是8字节的倍数,也就是说8字节是分段的基本单位,当然分组的最后一个段不做限制。这样最大的数据报长度为8*8192=65536字节,比目前限制的最大数据报长度还多1,能够满足对网络中所有数据报传送的需求。
- 生存时间:这是一个生存期计数器,最大为255s,但是实际上使用的时候用作跳数计数器,当值为0时数据报被丢弃,用来避免一个数据报过久的逗留在网络中。
- 高层协议:这里和链路层的类型作用相同,用来表示更高层的协议,这个数据报里是TCP
- 首部校验和:IP头部的校验和
- 源IP地址:数据报来源主机的IP地址
- 目的IP地址:数据报目的主机的IP地址
因为IP包的首部要占用 20 字节,所以这的MTU为1500-20 = 1480 字节
2.4 数据链路层数据包
以太网的数据包(数据链路层的数据包)的最大传输单元( MTU )大小是固定的,最初是 1518 字节,后面增加到 1522 字节,其中 1500 是负载字节,22 字节是头信息。
Ethernet II 帧结构::
名称 | 长度 |
---|---|
D-MAC | 6 字节 |
S-MAC | 6 字节 |
类型 Type | 2 字节 |
数据 | 46-1500 字节 |
CRS | 4 字节 |
Ethernet SNAP 帧结构:
名称 | 长度 |
---|---|
D-MAC | 6 字节 |
S-MAC | 6 字节 |
长度 Length | 2 字节 |
DSAP | 1 字节 |
SSAP | 1字节 |
数据 | 46-1500 字节 |
CRS | 4 字节 |
- 目的 MAC 地址(Destination MAC) 它首先使用最低有效位(IEB)传送48位值。接收方站点使用D-MAC来决定一个进入的数据包是否被送往特定的节点。目的地址可以是单独的地址,或者是广播或组播MAC地址。记住,广播地址为全1(十六进制形式为全F)并被送往所有设备,但组播地址只被送往网络中节点的同类子集。
- 源 MAC 地址(Source MAC) S-MAC 是48位的MAC地址,用来识别发送没备,它首先使用LSB。在 S-MAC 字段中,广播和组播地址格式是非法的。
- 类型(Type) 数据包类型,识别网络层的协议,如 IP(0x0800)、ARP(0x0806))
- 数据(Data) 这是从网络层传送到数据链路层的数据包。它的大小可以在46~1500字节之间变化。
- 循环冗余校验(CRC) 循环冗余校验(CRC)是位于帧末尾的字段,它用来表示帧校验序列(FraIue check sequence,FCS)。
- DSAP(Destation service access point) 目的 SAP
- SSAP(Source service access point ) 源 SAP
- SAP 表示帧的上层协议。
其他网络的最大传输单元如下: