1.OSI体系结构/参考模型
OSI网络模型一共有7层,自上而下分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
2.TCP/IP五层模型
TCP/IP网络模型自上而下分别是:应用层、传输层、网络层、数据链路层、物理层。
1.应用层:负责应用程序之间的数据沟通,程序员就是工作在这一层的。应用层当中典型的网络协议有http协议、DNS协议、DHCP协议等。
2.传输层:负责端口与端口之间的数据传输。传输层当中典型的网络协议有TCP协议、UDP协议。
3.网络层:负责路由转发以及ip地址管理。网络层当中典型的网络协议有IP协议、ICMP协议;典型的物理设备是路由器。
4.数据链路层:负责相邻设备之间的数据帧传输。数据链路层当中典型的网络协议是以太网协议;典型的物理设备是交换机。
5.物理层:负责将二进制数据转换为光电信号进行传输。物理层当中典型的网络协议是以太网协议;典型的物理设备是集线器。
3.分层的好处
分层的好处 参考:https://blog.csdn.net/u011329762/article/details/40508105?
-
各层之间是独立的。某一层可以使用其它层提供的服务而不需要知道服务是如何实现的。
-
灵活性好。当某一层发生变化时,只要其接口关系不变,则这层以上或以下的各层均不受影响。
-
结构上可分割开。各层可以采用最合适的技术来实现。
-
易于实现和维护。
-
能促进标准化工作。
4.网络传输中数据的封装与分用
现在假如有一台主机A想要发送一条数据到主机B里去,比如数据是123。基本过程是:主机A的应用程序在应用层将数据递交给传输层,传输层会根据不同的传输协议为这个数据打上不同的协议报头,比如打上TCP报头;然后再递交给网络层,网络层再为这条数据打上IP协议报头,再递交给数据链路层;数据链路层会给这条数据打上以太网帧头和帧尾,最后递交给物理层。层层打上协议报头的过程就叫做数据的封装。物理层再将这个封装好的数据通过网卡设备转换为光电信号,再通过网络传送到主机B。而主机B又会从它的物理层开始,逐步识别分析各个协议报头并递交给更上层,这个过程就是数据的分用;最后到达主机B的应用程序中。
5.网络传输中的五元组信息
在网络数据传输过程当中,有5个必不可少的信息分别是:源ip地址、源端口、目的ip地址、目的端口、协议。注意5个缺一不可。
ip地址:标识这条数据从哪一台主机来。
源端口:标识这条数据从这台主机的哪一个进程来。
目的ip地址:标识这条数据要去往哪一台主机。
目的端口:标识这条数据要去往这台主机的哪一个进程去。
协议:标识数据在网络传输过程中使用了哪些协议。
6.ip地址
ip地址的作用是:ip地址在网络当中唯一标识一台主机。ip地址有两个版本。
ipv4版本:
- 本质上是一个uint32_t的整数,4字节的整数,范围0~232。42亿多。
- 通常表示ip的时候,是用点分十进制的方式来表示的。以 . 分隔,每一个数字都占用1个字节。(0~255).(0~255).(0~255).(0~255)。
ipv6版本:为了解决ipv4版本的ip地址不够用,引入了ipv6版本的ip地址。
3. 本质上是一个uint128_t的整数,16字节的整数,范围0~2128。
4. 缺点:ipv6和ipv4不兼容,原因就是两者的ip协议的报头格式不同。
7.端口
端口的作用是:在一台机器当中唯一标识一个进程。
- 本质:uint16_t的整数,2字节的整数,范围0~216(0~65535)。
- 使用:网络当中的程序通信的时候,都是需要使用端口进行通信的;
- 其中0~1023是知名端口,已被占用(比如http占用80端口、https占用443端口、ssh服务占用22端口、ftp服务占用21端口、telent服务占用23端口)。
- 还有一些非知名端口,比如mysql占用3306端口、oracle占用1521端口。
8.网络字节序
字节序:CPU对内存当中的数据进行存取的顺序。
主机字节序:代表的是当前机器的字节序。
大端字节序:低地址存高位。
小端字节序:低地址存低位。
X86_64架构的机器都是小端机器,而网络字节序是大端字节序(网络标准);所以在小端机器和大端机器进行网络通信的时候,如果不转换字节序,则会造成小端机器很小的数字,经过网络传输被大端机器读出来变成一个大的数字。这样一来,不同格式的字节序之间的转换就显得尤为重要。
字节序转换
大端字节序转换为网络字节序,一般不用转换,因为网络字节序本身就是大端字节序。而小端字节序需要转换为网络字节序,下面介绍几种函数。
- uint32_t htonl(uint32_t hostlong):将32位主机字节序转换为网络字节序
- uint32_t ntohl(uint32_t netlong) :将32位网络字节序转换为主机字节序
- uint16_t htons(uint16_t hostshort):将16位主机字节序转换为网络字节序
- uint16_t ntohs(uint16_t netshort) :将16位网络字节序转换为主机字节序
- inet_addr(string ip):将string类型的ip地址转换为uint16_t,并将它的主机字节序转换为网络字节序