一、TCP/IP的层次结构
1、应用层:为用户的应用程序提供接口,使用户可以访问网络。(IE浏览器就处于应用层)
HTTP、TFTP、FTP、NFS等属于应用层的协议 。是用户客户端程序或软件之间使用的协议。
HTTP 超文本传输协议(浏览网页服务)
TFTP 文件传输协议(较快,但是不可靠)
FTP 文件传输协议(提供文件上传,文件下载服务,较慢但是可靠)
NFS 网络文件系统(Unix和Linux系统之间共享文件)
SMTP 简单邮件传输协议(邮件的发送和转发)
POP3 接收邮件(由服务器下载到本地)
Talnet (远程登录功能(配置交换机、路由器))
SNMP 简单网络管理协议(通过网管软件来管理网络)
DNS 域名系统,将域名解析为IP地址(将百度的域名转换为服务器的IP地址)
2、传输层(运输层):提供端到端的通信(两台计算机上的软件间的连接),对信息流具有调节作用。
TCP、UDP属于运输层的协议。在TCP/IP协议族中,网络层IP提供的是一种不可靠的服务,,它尽可能的把分组从源节点送到目的节点,但是并不提供任何可靠保证。而TCP在不可靠的IP层上提供了一个可靠的运输层(参见TCP三次握手),为了提供这种可靠的服务,TCP采用了超时重传,发送和接收的端到端的确认分组等机制。
TCP 传输控制协议 面向连接(打电话) 可靠服务
在通信之前要先建立连接 需要同时在线
UDP 用户数据报协议 非面向连接(发快递)不可靠 不稳定 但速度更快
源端口(Source Port) 目的端口(Desination Port)
序列号(Sequence Number)【数据包的序号】
确认号(Acknowledgment Number)(序列号+1)【用于指示下一个数据包序号】
报头的长度(HLEN):以32字节为单位的报头长度
保留域(Reserved):设置为0
编码位(Code Bits):用于控制段的传输(如会话的建立和终止)
包括:URG、ACK、PSH、RST、SYN、FIN 6个位
SYN(synchronous):请求建立TCP连接
FIN:断开TCP连接
RST:重置TCP连接
ACK:确认、反馈连接情况
PSH:将数据立刻送到应用层进行处理的命令
URG:判断紧急指针是否有效的命令
窗口大小(Windows):接收方能够继续接收的字节数【控制发送的速度】
校验和(Checksum):baokuo TCP报头和数据在内的校验和【判断数据传输是否出错】
紧急指针(Urgent Pointer):当前序列号到紧急位置的偏移量
选项(Option):厂商根据需要自定义的内容
MAC地址
数据(Data):上层协议数据
HTTP:80
端口范围是:0-6535(1 --- 255 之间一般是知名的端口号;256 --- 1023的端口号,通常是由Unix系统占用(系统占用);1024 ---5000 是大多数TCP、IP实现的临时分配;大于5000的一般是给其他服务预留的(Internet上并不常用的服务))
3、网络层(Internet层):IP包的封装和路径的选择
ICMP、IP、IGMP是网络层的协议。ICMP(控制报文协议)是IP协议的附属协议,IP层用它来与其他主机或路由器交换错误报文和其他重要信息;ICMP是Internet组管理协议,它用来把一个UDP数据多播到多个主机上。
网络层的协议
IP数据包的封装,定义IP地址
ICMP错误诊断(用ping测试网络连通性)
ARP将IP地址解析为MAC地址
RARP将MAC地址转换为IP地址
IP地址分类:IPV4长32位共4个字节(用点分十进制记法表示),由网络地址和主机地址组成。网络地址表示其属于互联网的哪一个网络,主机地址表示其属于该网络中的哪一台主机。二者是主从关系;又按字节分成4段,每个字段是一个字节,8位,最大值是255。
IP地址根据网络号和主机号分为A、B、C三类及特殊地址D、E。 全0和全1的都保留不用。
A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。
C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。
D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1] 。
E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。
在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255
回送地址:127.0.0.1。 也是本机地址,等效于localhost或本机IP。一般用于测试使用。例如:ping 127.0.0.1来测试本机TCP/IP是否正常。
4、数据链路层:为上层提供可靠的数据帧透明传输
链路管理、帧同步、寻址、流量控制、差错控制
MAC地址(网卡编号):48位的二进制数。表示为12位的16进制数。分为两部分:前24位为厂商编号,后24位为网卡的编号(由专门的机构分配)
二、TCP/IP各层数据封装过程
UDP数据与TCP数据基本一致,唯一不同的是,UDP传给IP的信息单元称为UDP数据包,并且UDP的首部长为8字节。
在上面的TCP、IP的分层结构图中我们可以看见,用户程序、TCP、UDP、ICMP等都会向IP传送数据,因此在IP的首部加入了长度为8bit的标识;1表示ICMP协议,2表示IGMP协议,6表示TCP,17表示UDP协议。
TCP、和UDP在传送数据的过程中都会用到一个16bit的端口号来表示不同的应用程序TCP和UDP把源端口号和目的端口号分别存入报文首部中。(216= 65536)
网络接口通常要发送和接收IP、ARP、RARP数据,因此在以太网的首部(及帧的首部)也有一个16bit的标识。
数据封装过程
三、各层数据包的结构
1、(链路层)以太帧结构(http://c.biancheng.net/view/6391.html)
字段 | 含义 |
---|---|
前同步码 | 用来使接收端的适配器在接收 MAC 帧时能够迅速调整时钟频率,使它和发送端的频率相同。前同步码为 7 个字节,1 和 0 交替。 |
帧开始定界符 | 帧的起始符,为 1 个字节。前 6 位 1 和 0 交替,最后的两个连续的 1 表示告诉接收端适配器:“帧信息要来了,准备接收”。 |
目的地址 | 接收帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。作用是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同,就会进一步处理;如果不同,则直接丢弃。 |
源地址 | 发送帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。 |
类型 | 上层协议的类型。由于上层协议众多,所以在处理数据的时候必须设置该字段,标识数据交付哪个协议处理。例如,字段为 0x0800 时,表示将数据交付给 IP 协议。 |
数据 | 也称为效载荷,表示交付给上层的数据。以太网帧数据长度最小为 46 字节,最大为 1500 字节。如果不足 46 字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。 在 Linux 中,使用 ifconfig 命令可以查看该值,通常为 1500。 |
帧检验序列 FCS | 检测该帧是否出现差错,占 4 个字节(32 比特)。发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。 |
2、(网络层)IP数据报结构(https://blog.csdn.net/prsniper/article/details/6762145)
如图,一个刻度表示1个二进制位(比特)。
1-1.版本4位,表示版本号,目前最广泛的是4=B1000,即常说的IPv4;相信IPv6以后会广泛应用,它能给世界上每个纽扣都分配一个IP地址。
1-2.头长4位,数据包头部长度。它表示数据包头部包括多少个32位长整型,也就是多少个4字节的数据。无选项则为5(红色部分)。
1-3.服务类型,包括8个二进制位,每个位的意义如下:
过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)
延迟字段:1位,取值:0(正常)、1(期特低的延迟)
流量字段:1位,取值:0(正常)、1(期特高的流量)
可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
成本字段:1位,取值:0(正常)、1(期特最小成本)
保留字段:1位 ,未使用
1-4.包裹总长16位,当前数据包的总长度,单位是字节。当然最大只能是65535,及64KB。
2-1.重组标识16位,发送主机赋予的标识,以便接收方进行分片重组。
2-2.标志3位,他们各自的意义如下:
保留段位(2):1位,未使用
不分段位(1):1位,取值:0(允许数据报分段)、1(数据报不能分段)
更多段位(0):1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)
2-3.段偏移量13位,与更多段位组合,帮助接收方组合分段的报文,以字节为单位。
3-1.生存时间8位,经常ping命令看到的TTL(Time To Live)就是这个,每经过一个路由器,该值就减一,到零丢弃。
3-2.协议代码8位,表明使用该包裹的上层协议,如TCP=6,ICMP=1,UDP=17等。
3-3.头检验和16位,是IPv4数据包头部的校验和。
4-1.源始地址,32位4字节,我们常看到的IP是将每个字节用点(.)分开,如此而已。
5-1.目的地址,32位,同上。
6-1.可选选项,主要是给一些特殊的情况使用,往往安全路由会当作攻击而过滤掉,普联(TP_LINK)的TL-ER5110路由就能这么做。
7-1.用户数据。
3、(传输层)tcp数据包结构(https://blog.csdn.net/prsniper/article/details/6762145)
1-1.源始端口16位,范围当然是0-65535啦。
1-2.目的端口,同上。
2-1.数据序号32位,TCP为发送的每个字节都编一个号码,这里存储当前数据包数据第一个字节的序号。
3-1.确认序号32位,为了安全,TCP告诉接受者希望他下次接到数据包的第一个字节的序号。
4-1.偏移4位,类似IP,表明数据距包头有多少个32位。
4-2.保留6位,未使用,应置零。
4-3.紧急比特URG—当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
4-3.确认比特ACK—只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。参考TCP三次握手
4-4.复位比特RST(Reset) —当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。参考TCP三次握手
4-5.同步比特SYN—同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。参考TCP三次握手
4-6.终止比特FIN(FINal)—用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
4-7.窗口字段16位,窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口 大小,然后通知对方以确定对方的发送窗口的上限。
5-1.包校验和16位,包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
5-2.紧急指针16位,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
6-1.可选选项24位,类似IP,是可选选项。
6-2.填充8位,使选项凑足32位。
7-1.用户数据