网络基础
路由器:数据包的跨网络转发
交换机:交换机连接的主机属于一个局域网
广域网:与局域网是相对的概念
协议
概念
协议就是约定,计算机协议就是计算机之间的约定
协议
减少通信成本
网络分层结构 — 网络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