网络通信依然数据,进程间通信的范畴。网络通信是不同主机间的进程间通信。

一、IOS模型、TCP模型

1、IOS 模型

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

理想模型==》尚未实现

tftp

b /etc/passwd

a /etc/123

应用层: 例如电子邮件、文件传输、http协议

表示层 :加密解密 gzip

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

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

网路层 :ipNAT

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

物理层 :100Mb/8  Gbits  100MB  同轴电缆  10Gb   2.4G  5G(网线、光纤)

应用层:为网络用户提供各种服务,例如电子邮件、文件传输等。

表示层:为不同主机间的通信提供统一的数据表示形式。

会话层:负责信息传输的组织和协调,管理进程会话过程。

传输层:管理网络通信两端的数据传输,提供可靠或不可靠的传输服务。

网路层:负责数据传输的路由选择和网际互连。

数据链路层:负责物理相邻(通过网络介质相连)的主机间的数据传输,主要作用包括物理地址寻址、数据帧封装、差错控制等。该层可分为逻辑链路控制子层(LLC)和介质访问控制子层(MAC)。

物理层:负责把主机中的数据转换成电信号,再通过网络介质(双绞线、光纤、无线信道等)来传输。该层描述了通信设备的机械、电气、功能等特性。

2、TCP/IP模型(sudo reboot重启配置文件)

tcp/ip模型,是从osi模型简化而来。

国际互联网模型==》分4层:

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

tcp/ip协议栈

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

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

网络层====》IP地址

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

3、常用网络协议

TCP/IP协议族:

www.taobao.com--->192.168.0.19

www.voa.com vpn

dns 域名解析

DHCR. 动态主机配置协议

应用层:HTTP TFTP(简单文件传输协议,近程)  FTP(文件传输协议,远程)  SNMP DNS...

传输层:TCP(传输控制协议) UDP(用户数据报协议) 56k猫

网络层:IP ICMP(互联网网络诊断协议) (ping) RIP(最佳路径) OSPF(最短路径) IGMP

接口层:ARP RARP...  ip--->mac 地址解析

arp...

192.160.0.112

二、IP地址

0103333344444

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

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

A类:超大规模性网络

8888

1.0.0.0 -126.255.255.255(范围,前一个号做主机号)

126.1.1.1

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(前2个号做主机号)

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.00-192.168.255.255

静态路由192.168.0.0 

192.168.0.1网关

192.168.0.255

D类:组播和广播

224.0.0.0 - 239.255.255.255

192.168.0.255 ==255.255.255.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

三、网络常用命令:

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

2、有ip地址(ifconfig)

3、配置网络设置

ip: ifconfig ethX X.X.X.X/24 up ifconfig ens33 192.168.0.13/24 up 255.255.255.0

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

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

测试:ping www.baidu.com

ifconfig:查看网络适配器的状态信息,查看自己的ip。

netstat -anp:查看本机所有的网络连接的状态。

四、网络接口:

1、socket 套接字(底层实现是队列)套接字,网络设备对应的文件描述符。

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

socket API application interface

2、ip+port地址+端口===》

地址用来识别主机;端口用来识别应用程序

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

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

3、网络字节序 ===》大端存储     网络设备都是大端存储;主机字都是小端存储

五、用户数据报UDP

数字转换函数:

#includee<arpa/inet.h>

1236234687

主机转网络:uint32_thtonl(uint32_thost long);

ipv4192.168.0.11~65535

uint16_t htons(uint16_t host short);

网络转主机:host tonet

net to host

uint32_t ntohl(uint32_t net long);

uint16_t ntohs(uint16_t net short);

sudo reboot

特性:无链接,不可靠,大数据,网络延迟小,开销小

字符串转换函数:
#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);

1、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 addr len);
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接

          口地址关联,用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从

          参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。
          注意:如果是客户端,则该函数可以省略,由默认 接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id。
          my_addr 是物理接口的结构体指针。表示该接口的信息。
                          struct sockaddr      ////通用地址结构
                          转换成网络地址结构如下:
                          struct _sockaddr_in.in_addr_t s_addr;    ///网络地址结构
          socklen_t addrlen: 参数2 的长度。
返回值:成功 0;失败  -1;

3、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 表示阻塞接受。
返回值:成功:表示接受的数据长度,一般小于等于le

// server 服务端
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);
int main(int argc, char **argv)
{
    // 1. internet , udp, 默认协议
    int udpfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == udpfd)
    {
        perror("socket");
        return 1;
    }
    // 2. 给套接字 绑定ip ,端口号
    // man 7 ip 查询 ipv4 的地址结构体
    struct sockaddr_in ser, cli;  // 服务器的地址结构体, 客户端的地址结构体
    bzero(&ser, sizeof(ser));
    bzero(&cli, sizeof(cli));
    ser.sin_family = AF_INET;     // ipv4
    ser.sin_port = htons(50000);  // host to net short 小端转大端
    ser.sin_addr.s_addr = inet_addr("192.168.14.128");
    int ret = bind(udpfd, (SA)&ser, sizeof(ser));
    if (-1 == ret)
    {
        perror("bind");
        return 1;
    }
    socklen_t len = sizeof(cli);
    while (1)
    {   
        char buf[1024]={0};
        recvfrom(udpfd,buf,sizeof(buf),0,(SA)&cli,&len);
        time_t tm;
        time(&tm);
        sprintf(buf,"%s %s",buf,ctime(&tm));//相当于data命令
        sendto(udpfd,buf,strlen(buf),0,(SA)&cli,len);
    }

    return 0;
}
// client 客户端
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr *(SA);
int main(int argc, char **argv)
{
    // 1. internet , udp, 默认协议
    int udpfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == udpfd)
    {
        perror("socket");
        return 1;
    }

    // man 7 ip 查询 ipv4 的地址结构体
    struct sockaddr_in ser;  // 服务器的地址结构体, 客户端的地址结构体
    bzero(&ser, sizeof(ser));
    ser.sin_family = AF_INET;     // ipv4
    ser.sin_port = htons(50000);  // host to net short 小端转大端
    ser.sin_addr.s_addr = inet_addr("192.168.14.128");

    while (1)
    {
        char buf[1024] = "hello,this is tcp test";
        sendto(udpfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));
        bzero(buf, sizeof(buf));

        recvfrom(udpfd, buf, sizeof(buf), 0, NULL, NULL);
        printf("from ser:%s\n", buf);
        sleep(1);
    }

    close(udpfd);
    return 0;
}

数据报

1.发送次数和接收次数要对应。

2.发送和接收大小,保持一致。如果接收的大小小,剩下的数据就接收不到了(1包数据)。

3.每次发送数据,链路都是不同的。

4.对于udp而言,是有读阻塞。

5.没有写阻塞。发送方发送数据太快,接收发没有及时接收,就会出现丢包。

6.半双工

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐