ip地址,端口,协议(协议分层OSI
、TCP/IP
)网络数据传输流程
网络发展背景
WAN
广域网
MAN
城域网
LAN
局域网
协议:通信双方的约定。
网络协议:网络通信环境中,数据的约定格式。
通信协议标准:网络互联的前提。
协议分层
一种协议的封装,便于使用。
对服务,接口,协议进行明确划分。
形成标准实现起来就简单了。
ISO
制定的OSI
七层参考模型:
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
TCP/IP
五层模型:
- 物理层
- 链路层
- 网络层
- 传输层
- 应用层 (将
OSI
中会话层、表示层、应用层整合)
应用层
负责应用程序之间的数据沟通。
- 常见协议:
HTTP
、FTP
、DHCP
、SMTP
、DNS
、SSH
、SSL
、TELNET
协议等。
传输层
负责端与端之间的数据传输。
-
常见协议:
TCP
、UDP
协议等。 -
设备:计算机操作系统
网络层
负责地址管理与路由选择。
- 常见协议:
IP
、ARP
、RARP
协议等。 - 设备:路由器
链路层
负责相邻设备之间的数据帧传输。
- 常见协议:
Ethernet
协议 /ETH
协议(以太网) - 设备:交换机
物理层
负责光电信号的传输。(以太网协议)
- 设备:集线器(用于信号放大等)
网络通信中数据的传输流程
ip地址与port端口
- ip地址:
(IPV4
版本):uint32_t
类型的数据(范围0~43亿左右
),在网络中唯一标识一台主机。
(IPV6
版本):uchar ip[16]
类型数据,但不向前兼容IPV4
,因此没有推广起来。
DHCP
动态地址分配计数:谁上网,给谁分配。不上网就不分配。
NAT
技术:地址替换,实现多人使用同一地址上网。
因为数字不好记忆,所以使用点分十进制形式来展示ip
地址。
每条数据中都会包含source ip
与destination ip
标识了这条数据从哪儿来,到哪儿去。
- 端口:
uint16_t
类型的数据,在网一台主机上标识一个进程。(端口范围0~65535
,0~1024
不推荐使用,可能已经预留)
(因为pid
会改变,而端口号不会改变,所以不使用进程pid
)
网络程序分为客户端与服务端,其中主动发起请求的一方是客户端,被动在指定位置接受请求的一方是服务端。
一个端口只能被一个进程占用,但一个进程可以使用多个端口。
每条数据中都会包含source port
与destination port
标识了这条数据从哪个进程,到哪个进程。
每条数据中包含:sip
、sport
、dip
、dport
、proto
(五元组:表示一条通信)
网络字节序
CPU
在内存中对数据进行存取的顺序。
- 大端字节序:低地址存高位
- 小端字节序:低地址存低位
大小端取决于:CPU
架构(如小端的X86_64
架构、大端的MIPS
架构)
如果通信两端主机字节序不同,就会造成数据二义性(针对存储大于一个字节的数据,字符串char a[] = "giturtle"
不会造成二义性)。
主机字节序:当前计算机的字节序。
那么如何解决这种二义性的现象?定立网络字节序标准:通信双方都是用网络字节序(大端字节序),同时也提高了程序的可移植性。
字节序的判定
伪代码:
union {
int a = 1;
char b;
};
//进行判定
if(b == 0)
big_endian;
if(b == 1)
little_endian;
TCP与UDP
传输层的两个协议:TCP
和UDP
。
孰优孰劣?视使用场景而定~
tcp
(传输控制协议):面向连接,可靠传输,面向字节流服务(管道等)
- 面向连接:通信之前,先建立连接,确保双方在线。
- 可靠传输:网络正常的情况下,数据不会丢失。
- 字节流服务:传输的是二进制数据块,首先传入缓冲区,区满再一次性发送,减少
I/O
次数。
【优点】:传输灵活。
【缺点】:二进制数据块在缓冲区会堆压,如tcp
的黏包问题,因为没有明显的数据界限。
TCP为了实现可靠传输,牺牲了部分性能。
UDP
(用户数据报协议):无连接,不可靠,面向数据报服务
面向数据报:每条数据有长度标识,所以数据间有明显间隔。整条发送,整条接受。
【优点】:不会产生黏包问题。
【缺点】:传输不够灵活
UDP要保证传输速度,如视频等。
使用场景:
TCP | UDP |
---|---|
传输文件保证数据安全(对文件安全性要求高) | 对数据安全性要求不是很高(对数据实时性要求高) |