【Linux第十课-计算机网络】网络基础、网络套接字、应用层自定义协议与序列化

网络基础

路由器:数据包的跨网络转发
交换机:交换机连接的主机属于一个局域网
广域网:与局域网是相对的概念

协议

概念

协议就是约定,计算机协议就是计算机之间的约定

协议
减少通信成本

网络分层结构 — 网络vs OS之间关系

1、软件分层
任何问题都可以添加一层软件层解决

2、网络分层
层与层之间是松耦合的,可以随时替换或者方便维护
硬件就是网络,单台计算机就是小型的网络

距离远了,必定会引发新的问题
(1)如何使用数据的问题 ---- 应用层解决
(2)可靠性问题 ---- 传输层解决
(3)主机定位的问题 ---- 网络层
(4)数据在局域网转发的问题 ---- 数据链路层
网络协议 (tcp/ip协议) 来解决这些问题

OSI七层模型:标准制定,不写代码 ----- 实际实现是五层
在这里插入图片描述

Windows和Linux可以通信的原因是:网络部分设计的一样
世界上所有的OS只要入网,就必须要遵守TCP/IP协议,保证不同主机之间的数据通信

站在语言角度

TCP/IP属于操作系统的一部分,所以它俩由C语言编写
协议:双方都认识的相同的、结构化的结构体数据类型

网络传输的基本流程

局域网通信

以太网
在同一局域网的主机能不能直接通信?
原理是什么?以太网的通信原理(一个教室的例子) — 问题:数据碰撞 ---- 碰撞的检测和避免
一个局域网称为一个碰撞域,任何时刻,只允许任何一台主机在局域网中发消息
局域网本质是一个临界资源
在这里插入图片描述
令牌环网:有个令牌,只要有令牌才能发信息

在这里插入图片描述
协议报头+有效载荷
报文不断被自顶向下进行交付的过程,要添加每一层的协议报头,叫作封装
在这里插入图片描述

接收方 — 解包与分用
1、将报头个有效载荷进行分离 ---- 解包
2、将自己的有效载荷交付给上层的哪一个协议(报头里包含上层协议是谁) ---- 分用

在这里插入图片描述

网络层及其上面的层所以主机的协议没有差别
数据链路层和物理层是不一样的

Mac地址:内置在网卡中的序列号,只在局域网中有效,表示子网中主机
IP地址:

网络套接字

预备知识

一、端口号
1、大部分的网络通信行为,都是用户触发的。计算机中,谁表示用户呢?进程!! ---- 客户的服务、服务端服务
2、把数据发送给目标主机,不是目的,是手段。真正的目的,是把数据交给这个主机上的某一服务(进程) — 服务要具有唯一的标识符端口号
3、网络通信的本质,其实是进程再帮我们进行网络通信,无论是对于C还是S
4、IP(唯一的一台主机) + port(该主机上的唯一的进程) = 互联网中唯一的一个进程
5、基于IP地址+端口号的通信方式称为套接字(socket)通信
网络通信本质就是进程间通信

pid VS port
为何不用pid?技术上可以用pid,但专事转办
OS中,每一个进程都要有pid,但是不是每一个进程都有port

二、传输层协议
TCP(传输控制协议):有链接、可靠传输、面向字节流
UDP:无连接、不可靠传输、面向数据报
三、字节序列
凡是放在网络中的数据都必须是大端

socket编程,是有不同类型的
有的是专门用来进行本地通信的 — Unix socket
有的是用来专门进行网络通信的通信 — inet socket
有的是用来进行网络管理的 — raw socket

UDP网络服务

echo server

InitServer

1、创建UDP套接字
socket:创建套接字

创建一个一端的用来通信的服务端,返回一个文件描述符
向网络中写数据,就如同向文件中写数据一样
domain:通信类型
在这里插入图片描述
type:udp是面向数据包的
SOCK_DGRAM:UDP
SOCK_STREAM:TCP在这里插入图片描述
protocol:0 不填,前两个填完就是UDP了

在这里插入图片描述
2.0、填充sockaddr结构

//头文件
#include <arpa/inet.h>

在这里插入图片描述

(1)清理
bzero
在这里插入图片描述
(2)对四个字段的填充
sin_family:表明传输的类型

AF_INET

要对_port转成网络序列
在这里插入图片描述
sin_addr:IP地址,点分十进制的IP地址 -> 4字节IP -> 网络序列

inet_addr:自动将ip地址转成四字节并转成网络序列
在这里插入图片描述

2.1、绑定sockfd和网络信息(IP + Port)
socket = ip + port

addr:传入struct sokaddr_in结构体
addrlen:传入结构体的长度

在这里插入图片描述

void InitServer()
    {
   
        //1、创建UDP sock  判断是否出差
        int _sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if(_sockfd < 0)
        {
   
            std
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值