Linux-协议-OSI七层模型-TCP/UDP-数据流向-ip/端口-网络字节序
Posted 天津 唐秙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-协议-OSI七层模型-TCP/UDP-数据流向-ip/端口-网络字节序相关的知识,希望对你有一定的参考价值。
文章目录
1. 协议
1.什么是协议?
协议是双方约定同一种语言,进行沟通。
2.什么是网络协议?
通信双方,约定通信时使用的数据格式,进行网络通信。例子:人a和人b拿手机进行通信,人a->手机a->a地的基站->b地的基站->手机b->人b
3.协议分层
网络是有分层结构的,每一个分层当中有不同的网络协议,不同的网络协议完成不同的事情,不同的分层都有自己要完成的事情。
4.网络协议簇
网络协议簇指的是很多个网络的分层,以及每一个分层需要完成的功能,以及每一个分层拥有的协议,还规定了每一个分成与自己上下层的关系。
2. OSI七层模型(网络模型,网络分层模型)
OSI七层模型:工业中并没有广泛的应用,因为划分的太繁琐。主要有物数网传会表应,物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
3. TCP/IP四层(或者五层)模型
应用层:程序员写的代码都是在应用层代码,也就是说程序员是在这一层工作的。
传输层:端与端之间的传输,端指的是端口(port)(端点)。
网络层:ip地址管理(增加源ip,目的ip)和路由选择(要去往哪一个目的主机),典型的设备:路由器。
数据链路层:网络数据帧的传输,负责相邻设备之间的传输,典型设备:交换机。
物理层:将二进制数据转换为光电信号,进行传输,典型设备:集线器(远距离传输光电信号时,波峰和波谷的差值会变小,因此需要集线器来放大信号)。
4. 数据流向
1.微信是否是应用程序?微信产生的数据是不是应用层数据?
微信是应用程序,因为微信是工作在应用层的。微信产生的数据是应用层数据。
2.数据的传输流向,以微信消息为例。
- 你吃了没->应用层->传输层->网络层->数据链路层->物理层->光电信号->对端物理层->对端数据链路层->对端网络层->对端传输层->对端应用层-》你吃了没
网络数据的转发需要先经历自己的网络协议栈,进而通过网络将数据转化成为光电信号,传输到对端机器。
对端机收到数据之后,需要经历自己的机器网络协议栈的层层向上提交,一直到将数据提交到应用层的应用程序。
5. ip、端口的本质和作用
5.1 ip地址
ipv4版本的ip地址,本质上是一个unit32_t的整数,范围:(0-42亿+),也就是意味着ipv4版本的ip地址只有42亿多个。
ipv4版本的ip地址,通常是使用点分十进制的方式来表示的,例如“192.168.138.2”。
点分十进制:以“.”分隔出来了4部分,每一个部分占用1个字节,换句话说,每个部分的每个数字的范围都是(0-255)
作用:可以在网络当中唯一标识一台主机。
一个ip地址只能被一台机器所占有(有疑问的),一个公网ip只能被一台机器所占有,一个机器可以拥有多个ip地址。
NAT地址转换协议
5.2 端口
1.端口的本质
uint16_t的整数,范围(0,65535)
2.作用
在一台机器当中唯一标识一个进程。引申出来的含义:一个端口只能被一个进程所绑定,一个进程可以绑定多个端口。
6. 常见的面试问题
1.一条网络数据需要网络转发的时候,需要具备哪些条件?
网络数据的五元组信息{源IP地址,源端口,目的IP地址,目的端口,协议},网络数据当中是一定存在五元素信息的,否则网络就无法转发。
2.网络协议栈在进行数据的转发的时候,做了哪些事情?
数据的封装与分用
3.对于接收而言,所有的网络数据都是需要经过网络协议栈的,但是怎么区分网络数据到底是属于哪个应用程序的?
如果上面的内容您认真看完,这个问题就很简单了,通过端口进行区分。
7. 网络字节序
1.什么是字节序?
CPU对内存数据的存取顺序
2.大端字节序&小端字节序
小端:低位保存在低地址(大多数)
大端:低位保存在高地址
3.网络字节序
采用大端字节序进行传输
4.主机字节序
主机字节序指的是机器具体的字节序,主机是大端,则认为主机字节序是大端,主机是小端,则认为主机字节序是小端。
5.网络数据需要继续转发之前:主机字节序转换成为网络字节序
6.网络数据接收之前:网络字节序转换成为主机字节序
7.为什么网络数据需要转化成为网络字节序?
网络规定采用大端字节序作为网络字节序,路由设备或者交换机需要对网络数据进行分用到网络层,以获取到“目的ip地址”,而这些设备继续分用的时候默认是按照网络字节序进行分用的。
8.对于UDP协议:
(1)无连接:当UDP客户端想要给UDP的服务端发送数据的时候,只需要知道服务端的IP地址和端口,就可以直接发送了,但是不知道服务器是否运行。引申含义:在发送数据之前是不知道服务端的状态信息的。
(2)不可靠:不保证UDP的数据一定到达对端机器(可能存在网络闪断(断网),网络丢包(路由转发能力不足))
(3)面向数据报:UDP数据是整条数据接收和发送的(每次转发是整条的,之间没有关系)
9.TCP协议
(1)有连接:连接双方在发送数据之前,需要进行连接(需提前告知,沟通连接的信息)。
(2)可靠传输:保证数据是有序可靠到达对端的。
(3)面向字节流:上一次和下一次的数据是没有明显的数据边界的。
存在TCP粘包问题
8. UDP的socket编程
1.编程流程:
CS模型:client-server
BS模型:浏览器-服务端
2.创建套接字
int socket
domain: 指定当前的地址域,指定网络层当中使用什么协议
AF_INET:ipv4网络
AF_INET6:ipv6网络
AF_UNIX:本地域套接字
type: 创建套接字的类型
SOCK_DGRAM:用户数据报套接字->UDP协议
SOCK_STREAM:流式套接字->tcp协议
protocol:
0:表示使用套接字类型默认的协议
IPPROTO_UDP:17
IPPROTO_TCP:6
返回值:
返回套接字描述符,套接字描述符本质上就是一个文件描述符
成功:大于等于0
失败:小于0
创建套接字目的是在内核当中创建一个与协议相关的缓冲区,用来保存应用层给传输层的数据,或者是网络层给传输层的数据
代码
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd < 0)
{
perror("socket");
return 0;
}
printf("sockfd: %d\\n", sockfd);
while(1)
{
sleep(1);
}
return 0;
}
文件描述符的值默认是从0开始,标准输入,标准输出,标准错误。
查看进程的调用堆栈,因为要看现象,主函数当中死循环,所以能看见sleep。
文件描述符
指向了内存当中的一块缓冲区,不是指向一个文件,所以闪红。
以上是关于Linux-协议-OSI七层模型-TCP/UDP-数据流向-ip/端口-网络字节序的主要内容,如果未能解决你的问题,请参考以下文章