Linux-协议-OSI七层模型-TCP/UDP-数据流向-ip/端口-网络字节序

本文详细讲解了协议的作用、网络分层模型,重点剖析了OSI七层和TCP/IP四/五层模型。深入探讨了IP地址和端口的原理,解答了常见面试问题,并解析了网络字节序和UDP/TCP的区别。最后介绍了UDP套接字编程的基础,适合网络通信技术入门者阅读。
摘要由CSDN通过智能技术生成

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。
在这里插入图片描述
文件描述符
  指向了内存当中的一块缓冲区,不是指向一个文件,所以闪红。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天津 唐秙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值