linux——网络编程(1)ositcp

网络编程

open system interconnect

1、OSI 模型 ===》开放系统互联模型 ==》分为7层:

理想模型 ==》尚未实现

tftp

b /etc/passwd

a /etc/123

应用层

表示层 加密解密 gzip

会话层 网络断开,连接状态,keep-close keep-alive

传输层tcp udp 协议 文件 视频,音频

网路层ip NAT

链路层 交换机 数据的格式化 帧 校验

物理层 100Mb/8 Gbits 100MB 同轴电缆 10Gb 2.4G 5G

TCP/IP模型 ==》网际互联模型 ==》分为4层:

实用模型 ===》工业标准

tcp/ip协议栈

应用层 ====》应用程序

传输层 ====》端口号tcp udp

网络层 ====》IP 地址

接口层 ====》网卡 驱动 1GB

pcap ,,,

2、TCP/IP协议族:

www.taobao.com ---> 192.168.0.19

www.voa.com vpn

dns 域名解析

每个地方有一到两个dns服务器

将网站字符串转化成ip地址。

DHCP

DHCP是一个局域网的网络协议,使用UDP协议工作,主要应用于大型局域网络环境中,能够为网络内的终端快速自动分配IP地址,帮助网络管理人员将IP地址和其他IP信息分配给网络中不同终端。DHCP还可以为设备配置正确的子网掩码、默认网关和DNS服务器信息。

应用层: HTTP TFTP FTP SNMP DNS ...

传输层: TCP UDP 56k猫

网络层: IP ICMP(ping) RIP OSPF IGMP ...

物理层: ARP RARP ... ip--->mac

arp,,,,

192.160.

TCP/IP协议族与DNS处理

在TCP/IP协议族中,DNS(域名系统)是一个关键部分,它负责将人类可读的域名(如www.taobao.com)转换为机器可读的IP地址(如实际分配给淘宝服务器的公网IP地址)。每个地方(如城市、地区或数据中心)可能有一个或多个DNS服务器来处理这些请求。

DHCP
DHCP(动态主机配置协议)是一个用于自动分配IP地址和其他网络配置参数的协议。它使用UDP协议在局域网内工作,帮助网络管理员简化网络配置过程。DHCP不仅可以分配IP地址,还可以配置子网掩码、默认网关和DNS服务器等信息。

协议层次

应用层 :包括HTTP (用于网页传输)、TFTP (简单文件传输协议)、FTP (文件传输协议)、SNMP (简单网络管理协议)、DNS (域名系统)等。
传输层TCP (传输控制协议)和UDP (用户数据报协议)工作在这一层,提供可靠的端到端通信(TCP)或不可靠的数据报服务(UDP)。提到的"56k猫"通常指的是56kbps的调制解调器,这是早期的互联网接入技术,与TCP/IP协议层无直接关联。

网络层:IP (互联网协议)是这一层的核心,负责数据包的路由和转发。ICMP (Internet控制消息协议,常用于ping操作)、RIP (路由信息协议)、OSPF (开放最短路径优先)、IGMP (Internet组管理协议)等协议也在此层工作。
物理层:虽然ARP(地址解析协议)和RARP(反向地址解析协议)在逻辑上属于网络层,但它们的工作更接近于物理层,因为它们涉及IP地址与MAC地址之间的转换。ARP用于将IP地址解析为MAC地址,而RARP(现已很少使用)用于相反的操作。

URL信息

**http://www.taobao.com**:这是淘宝网的官方网址,通过DNS解析,用户可以访问到淘宝的服务器。但直接映射到`192.168.0.19`是不准确的,因为这是一个私有IP地址范围,通常用于局域网内部。

**http://www.voa.com**:根据文档2,这个URL被标记为无效。可能该域名不存在、已被注销或暂时无法访问。

TCP编程基础知识:

1、网络基础 ===》A B C D E 类

010 3333344444

IP地址 == 网络位 + 主机位

IP地址的分类: 点分十进制 ipv4 712934

A类: 超大规模性网络

8 8 8 8

1.0.0.0 - 126.255.255.255 126.1.1.1 (IP地址的范围)

126.1.1.2

255.0.0.0 (掩码)

私有:

10.0.0.0 - 10.255.255.255

127.0.0.1
B类: 大中规模型网络

128.0.0.0 - 191.255.255.255(范围)

128.2.1.2 128.2.7.2

255.255.0.0(掩码)

私有:

172.16.0.0 - 172.31.255.255

C类: 中小规模型网络

192.0.0.0 - 223.255.255.255(范围)

255.255.255.0(掩码)

私有:

192.168.0.0 - 192.168.255.255

静态路由

192.168.0.0 后两位都是0(表示整个网络)

192.168.0.1 网关(最后一位相当于gate)

192.168.0.255 (广播)一个人发所有局域网的人都想接到,就发送到255)

D类: 组播和广播

224.0.0.0 - 239.255.255.255(组播)

192.168.0.255 == 255.255.255.255(4个255,局域网中的所有人)

235.1.2.3

192.168.1.0

192.168.0.1 网关

192.168.1.255 广播

E类: 实验

240.0.0.0 - 255.255.255.255

网络配置文件与命令

C 类网络:

ip地址的前三组是网络地址,第四组是主机地址。

二进制的最高位必须是: 110xxxxx开头

十进制表示范围: 192.0.0.0 -223.255.255.255

默认网络掩码: 255.255.255.0

网络个数: 2^24 个 约 209 万个

主机个数: 2^8 个 254 个+2 ===》1 是网关 1是广播

私有地址: 192.168.x.x 局域网地址。

sudo vim /etc/network/interfaces ------网络配置命令

这条命令使用sudo以超级用户权限运行vim文本编辑器,打开/etc/network/interfaces文件。这个文件包含了Linux系统的网络接口配置信息。在文件中,你可以定义或修改网络接口(如以太网、Wi-Fi等)的配置,如IP地址、子网掩码、网关等。写一个DHCP进去。

sudo /etc/init.d/networking restart

这条命令也是以超级用户权限执行,用于重启网络服务。通过重启网络服务,应用/etc/network/interfaces文件中对网络接口所做的任何更改。这个命令可能会因Linux发行版的不同而有所差异,例如在基于systemd的系统中,可能会使用sudo systemctl restart networkingsudo systemctl restart NetworkManager(如果系统使用NetworkManager)。

sudo reboot

最后,这条命令以超级用户权限执行系统重启。重启后,新的网络接口配置将生效

192.168.0.0

192.168.0.1 route

192.168.0.255 boardcast

801.n.g

一、 单机上网的配置:

1、有网络接口并插入网线。

2、有ip地址

3、配置网络设置

ip: ifconfig ethX X.X.X.X/24 up

ifconfig ens33 192.168.0.13/24 up 255.255.255.0 (临时性修改ip地址)

网关: route add default gw x.x.x.x

DNS: vi /etc/resolv.conf ==>nameserver 8.8.8.8

测试:ping www.baidu.com 测试与其他主机的通讯功能

netstat -anp 查看网络状态:

在Unix、Linux系统中常用的命令,用于显示网络连接、路由表、接口统计信息、伪装连接和多播成员资格等信息。

二、网络接口

1、socket 套接字 ==》BSD socket ==》用于网络通信的一组接口函数。

类似于文件标识符,跟网络设备相关联的。

socket api (application interface API 函数)

是一组函数或方法,用于在应用程序之间(包括跨网络)进行通信。

2、ip+port 地址+端口

===》地址用来识别主机

端口用来识别应用程序

port分为TCP port / UDP port 范围都是: 1-65535

约定1000 以内的端口为系统使用。

http 80 www.baidu.com

3306

telnet 21

ssh 22

3、网络字节序 ===》大端存储

12 00 小端 0x12345678

00 12

192.168.0.12

12.0.168.192

00 12

数字转换函数:

#include <arpa/inet.h>

1236234687

主机转网络:(大小端转化)

uint32_t htonl(uint32_t hostlong);

ipv4 192.168.0.1 1~65535

uint16_t htons(uint16_t hostshort);

网络转主机:host to net

net to host

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

字符串转换函数:

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

主机转网络:in_addr_t inet_addr(const char *cp);

inet_addr("192.168.1.20");

cli.sin_addr

网络转主机:char *inet_ntoa(struct in_addr in);

client, server

browser

b/s http

p2p peer

  1. 由于网络协议通常指定了特定的字节序(如网络字节序,它实际上是大端序),因此发送方和接收方必须遵循相同的规则来处理数据。
  2. 如果发送方和接收方的字节序不同,就需要在发送前将数据转换为网络字节序,并在接收后进行相应的转换。

三、客户端与服务端收发交互

1、模式 C/S 模式 ==》服务器/客户端模型

server:socket()-->bind()--->listen()-->accept()-->recv()-->close()

client:socket()-->connect()-->send()-->close();

int on = 1;

setsockopt(listfd, SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

服务器端:

#include <sys/types.h> /* See NOTES */

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain 地址族,PF_INET == AF_INET ==>互联网程序

PF_UNIX == AF_UNIX ==>单机程序

type 套接字类型:

SOCK_STREAM 流式套接字 ===》TCP

SOCK_DGRAM 用户数据报套接字===>UDP

SOCK_RAW 原始套接字 ===》IP

protocol 协议 ==》0 表示自动适应应用层协议。

返回值:成功 返回申请的套接字id

失败 -1;

2、int bind(int sockfd, struct sockaddr *my_addr,
socklen_t addrlen);

功能:如果该函数在服务器端调用,则表示将参数1相关

的文件描述符文件与参数2 指定的接口地址关联,

用于从该接口接受数据。

如果该函数在客户端调用,则表示要将数据从

参数1所在的描述符中取出并从参数2所在的接口

设备上发送出去。

注意:如果是客户端,则该函数可以省略,由默认

接口发送数据。

参数:sockfd 之前通过socket函数创建的文件描述符,套接字id

my_addr 是物理接口的结构体指针。表示该接口的信息。

struct sockaddr 通用地址结构

{

u_short sa_family; 地址族

char sa_data[14]; 地址信息

};

转换成网络地址结构如下:

struct _sockaddr_in ///网络地址结构

{

u_short sin_family; 地址族

u_short sin_port; ///地址端口

struct in_addr sin_addr; ///地址IP

char sin_zero[8]; 占位

};

struct in_addr

{

in_addr_t s_addr;

}

socklen_t addrlen: 参数2 的长度。

返回值:成功 0

失败 -1;

3、 int listen(int sockfd, int backlog);

功能:在参数1所在的套接字id上监听等待链接。

参数:sockfd 套接字id

backlog 允许链接的个数。

返回值:成功 0

失败 -1;

4、int accept(int sockfd, struct sockaddr *addr,
socklen_t *addrlen);

功能:从已经监听到的队列中取出有效的客户端链接并

接入到当前程序。

参数:sockfd 套接字id

addr 如果该值为NULL ,表示不论客户端是谁都接入。

如果要获取客户端信息,则事先定义变量

并传入变量地址,函数执行完毕将会将客户端

信息存储到该变量中。

addrlen: 参数2的长度,如果参数2为NULL,则该值

也为NULL;

如果参数不是NULL,&len;

一定要写成len = sizeof(struct sockaddr);

返回值:成功 返回一个用于通信的新套接字id;

从该代码之后所有通信都基于该id

失败 -1;

5、接受函数:/发送函数:

read()/write () ///通用文件读写,可以操作套接字。

recv(,0) /send(,0) ///TCP 常用套机字读写

recvfrom()/sendto() ///UDP 常用套接字读写

ssize_t recv(int sockfd, void *buf, size_t len,

int flags);

功能:从指定的sockfd套接字中以flags方式获取长度

为len字节的数据到指定的buff内存中。

参数:sockfd

如果服务器则是accept的返回值的新fd

如果客户端则是socket的返回值旧fd

buff 用来存储数据的本地内存,一般是数组或者

动态内存。

len 要获取的数据长度

flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len

失败 -1;

6、close() ===>关闭指定的套接字id;

相关推荐
Empty_77711 分钟前
Ansible进行Nginx编译安装的详细步骤
linux·nginx·ansible
猪在黑魔纹里20 分钟前
docker run hello-world失败、报错
linux·docker·容器
NewCarRen28 分钟前
自动驾驶与联网车辆网络安全:系统级威胁分析与韧性框架
网络·网络安全·自动驾驶
q***465238 分钟前
若依部署Nginx和Tomcat
运维·nginx·tomcat
行初心1 小时前
uos基础 dmesg 查看内核的实时日志
运维
行初心1 小时前
uos基础 journalctl 查看系统的实时日志
运维
行初心1 小时前
uos基础 ffmpeg 查看多媒体解码的配置信息
运维
路人甲ing..2 小时前
Ubuntu 怎么把树莓派内存卡备份制作成为镜像
linux·运维·ubuntu
QMY5205202 小时前
爬虫技术抓取网站数据的方法
运维·爬虫·自动化
zz-zjx2 小时前
docker进阶---docker底层实践2025
运维·docker·容器