1.15io网络

本文详细介绍了子网掩码的作用,IP地址的三级划分,以及TCP/IP协议下服务器端和客户端的通信过程,包括socket创建、bind、listen、accept、connect和数据收发等关键步骤,以及UDP通信的简单模型。
摘要由CSDN通过智能技术生成

子网掩码

1.由于对于一个网络下面的主机号还是很庞大,为了进一步划分网络,我们可以将主机号再次进行划分为两部分,分别是网段号和主机号

2.此时就引入的子网掩码的概念

3. 在引入子网掩码后,IP = 网络号 + 子网号 + 主机号

4.子网掩码:用于ip地址的三级划分,划分时,用户可以选择划分,也可以不划分,如果不划分,就使用默认的子网掩码

定义格式:与IP地址一样长的32位整数,由一串连续的1和一串连续的0组成

默认子网掩码:1的个数与ip地址中网络号的个数保持一致,0的个数与ip地址中主机号的个数保持一致

默认子网掩码

C类网络:

192.168.125.161 ---> 11111111 111111111 11111111 000000000 ----> 255.255.255.0

A类网络:

58.1.2.3 ---> 11111111 000000000 00000000 00000000 ----->255.0.0.0

B类网络:

150.1.2.3 ---> 11111111 11111111 00000000 00000000 ----> 255.255.0.0

D类网络和E类网络没有子网掩码

5.子网掩码的使用:ip地址 & 子网掩码 ==> 子网网段

以192.168.125.161为例,子网掩码为255.255.255.0

   11000000 10101000 01111101 10100001

& 11111111 11111111 11111111 00000000 ——————————————————————————————————————

11000000     10101000 01111101 00000000 --->192.168.125.0 子网网段

6.特殊的网络

当前网络:网络加主机号为0的ip地址,例如:192.168.125.0

广播地址:网络号加主机号为255的ip地址,例如:192.168.125.255

网关地址:网络号加主机号为1的ip地址,例如:192.168.125.1

端口号(重要)

1.  端口号是能够实现网络端对端的通信

2.  是主机中某个进程的标识,由于某个进程关闭后,再打开,pid会不断更改,所以,在启动一个进程时,可以指定端口号,标识该进程

3.  端口号是一个2字节的无符号整数,取值范围[0,65545]

4.  端口号的分类:

众所周知的端口号:

0~1023端口编程时候不要使用,是那些”VIP“应用程序占了

TCP 21端口:FTP文件传输服务

TCP 23端口:TELNET终端仿真服务

TCP 25端口:SMTP简单邮件传输服务

TCP 110端口:POP3邮局协议版本3

TCP 80端口:HTTP超文本传输服务

TCP 443端口:HTTPS加密超文本传输服务

UDP 53端口:DNS域名解析服务

UDP 69端口:TFTP文件传输服务

TCP和UDP的端口号是相互独立的

可以使用的:1024~49151,就是我们平时编写服务器使用的端口号

临时端口号:49152~65535,这部分是客户端运行时候动态选择的

域名解析

由于使用IP地址来指定计算机不方便人们记忆,且输入时候容易出错,用字符标识网络种计算机名称方法。

这种命名方法就像每个人的名字,这就是域名(Domian Name)

套接字

概念

1> 最早的套接字也是跟消息队列、共享内存、管道一样,只能实现同一主机之间的多个进程间的通信

2> 随着tcp/ip协议族的出现,使得消息能够穿过网卡设备,在网络中进行传输

3> 套接字通信使用的是套接字文件,也是一种特殊的文件,bcd-lsp中的s说的就是该文件

4> socket这个函数,用于创建一个套接字文件,套接字文件的通信原理如下所示

socket函数介绍

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

#include <sys/socket.h>

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

功能:创建一个用于通信的端点,并返回该通信对应的文件描述符,描述符使用最小未分配原则

参数1:通信域对应的协议族 AF_UNIX, AF_LOCAL Local communication(本地通信) unix(7) man 7 unix可以查看相信信息 AF_INET IPv4 Internet protocols(IPv4通信) ip(7) man 7 ip可以查看相信信息 AF_INET6 IPv6 Internet protocols(IPv6通信) ipv6(7) man 7 ipv6可以查看相信信息

参数2:指定通信语义,理解成传输方式 SOCK_STREAM 提供支持TCP通信 SOCK_DGRAM 提供支持UDP通信 SOCK_RAW 通过原始的套接字通信

参数3:通信协议,如果参数2指定了确定的通信方式,该参数填0即可 如果不确定通信方式,可用的参数有: TCP:IPPROTO_TCP UDP:IPPROTO_UDP

返回值:成功返回套接字文件描述符,失败返回-1并置位错误码

基于TCP的基本通信

通信流程

服务器端相关API

1> 创建套接字:该套接字用于接收客户端的连接请求使用,并不是用于通信的套接字

2> bind绑定端口号和IP地址

struct sockaddr_in

{

        sa_family_t sin_family;

        /* address family: AF_INET */ 通信域

        in_port_t sin_port; /* port in network byte order */ 端口号,网络字节序

        struct in_addr sin_addr; /* internet address */ 网络地址,是一个结构体

};

struct in_addr {

         uint32_t s_addr; /* address in network byte order */ IP地址,网络字节序

};

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

#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

功能:给指定的套接字文件描述符绑定IP地址和端口号

参数1:要绑定的套接字文件描述符

参数2:地址信息结构体,包含了通信域、IP地址、端口号

参数3:参数2的大小

返回值: 成功返回0,失败返回-1并置位错误码

3> listen设置监听

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

#include <sys/socket.h>

int listen(int sockfd, int backlog);

功能:将套接字文件描述符设置成监听状态,以监听客户端的连接请求

参数1:服务器套接字文件描述符

参数2:挂起队列的长度,当该队列长度满时,其他连接的客户端将会报错,一般设置为128

返回值: 成功返回0,失败返回-1并置位错误码

4> accept阻塞等待客户端连接请求

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

#include <sys/socket.h>

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

功能:阻塞接收客户端的连接请求,并给该客户端创建一个新的用于通信的套接字

参数1:用于连接的套接字文件描述符

参数2:用于接收客户端的地址信息的结构体指针,如果不愿意接收,填NULL即可

参数3:接收客户端的地址信息的长度,是一个指针,也需要传递变量的地址

返回值:成功返回一个用于通信的套接字文件描述符失败返回-1并置位错误码

5> 数据收发函数:send、recv

#include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags);

功能:向套接字文件描述符中发送数据 参数1:要发送的套接字文件描述符 参数2:要发送数据的起始地址 参数3:要发送数据的大小 参数4:标识是否阻塞

0:表示阻塞 MSG_DONTWAIT:表示非阻塞

返回值:成功返回发送的字节个数,失败返回-1并置位错误码

#include <sys/types.h>

#include <sys/socket.h>

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

功能:从给的的套接字文件描述符中读取数据 参数1;要读取的套接字文件描述符 参数2:读取数据的容器地址 参数3:读取的大小

参数4: 标识是否阻塞 0:表示阻塞 MSG_DONTWAIT:表示非阻塞

返回值: >0:表示接收的字符的个数 =0:表示对方已经退出 =-1:出错,置位错误码

客户端端相关API及实现

1> socket:创建一个用于通信的套接字文件描述符

2> bind:可绑定也可以不绑定

3> connect:连接服务器

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

#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

功能:将指定的客户端套接字,连接到服务器

参数1;客户端套接字文件描述符

参数2:服务器的地址信息结构体

参数3:参数2的大小

返回值:成功返回0,失败返回-1并置位错误码

4> send\recv: 通信

5> close:关闭套接字

基于UDP的基础通信

通信模型

UDP服务器模型

1> socket:创建用于通信的套接字文件描述符

2> bind:绑定端口号和IP地址

3> sendto/recvfrom:数据收发

4> close:关闭客户端

udp客户端模型

1> socket 创建套接字

2> bind 可以绑定也可以不绑定

3> 数据收发

4> 关闭套接

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值