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;

相关推荐
humors2215 分钟前
阿里云ECS服务器监控报警配置
运维·服务器·安全·阿里云·云计算
mit6.8248 分钟前
[Redis#3] 通用命令 | 数据类型 | 内部编码 | 单线程 | 快的原因
linux·redis·分布式
hgdlip11 分钟前
使用代理ip和本地网络的区别是什么
网络·网络协议·tcp/ip
^Lim23 分钟前
esp32 JTAG 串口 bootload升级
java·linux·网络
小林熬夜学编程1 小时前
【Linux系统编程】第五十弹---构建高效单例模式线程池、详解线程安全与可重入性、解析死锁与避免策略,以及STL与智能指针的线程安全性探究
linux·运维·服务器·c语言·c++·安全·单例模式
玖玖玖 柒染1 小时前
windows下sqlplus连接到linux oracle不成功
linux·windows·oracle
LuckyTHP1 小时前
CentOS 9 无法启动急救方法
linux·运维·centos
Bonne journée1 小时前
centos和ubuntu有什么区别?
linux·ubuntu·centos
vvw&1 小时前
如何在 Ubuntu 22.04 上安装带有 Nginx 的 ELK Stack
linux·运维·nginx·ubuntu·elk·elasticsearch·开源项目
Linux运维老纪1 小时前
交换机配置从IP(Switch Configuration from IP)
linux·服务器·网络·安全·运维开发·ip