Linux学习-网络UDP

04-11 1269阅读

网络

    数据传输,数据共享

网络协议模型

    OSI协议模型

        应用层              实际发送的数据

        表示层              发送的数据是否加密

        会话层              是否建立会话连接

        传输层              数据传输的方式(数据报、流式)

        网络层              数据的路由(如何从一个局域网到达另一个局域网)        IP地址

        数据链路层          局域网下如何通信

        物理层              物理介质的连接

    TCP/IP协议模型   

        应用层              传输的数据

        传输层              传输的方式

        网络层              数据如何从一台主机到达另一台主机

        网络接口层          物理介质的连接

    应用层:

        HTTP    超文本传输协议

        HTTPS   

        FTP     文件传输协议

        TFTP    简单文本传输协议

        SMTP    邮件传输协议

        MQTT    物联网交互

        TELNET   远程登陆协议

        ..

    

    传输层:

        UDP     用户数据报协议 。 不会对接收ip是否可以接受进行核验,直接发送。是否收到数据也不知道。

                特点:

                    1.实现机制简单

                    2.资源开销小

                    3.不安全不可靠

        TCP     传输控制协议   在通信之前进行三次握手。发送请求应答信号SYN。收到后回复ACK+SYN确认应答并请求对方应答。对方在发ACK应答,保证双方都是收发通讯正常。

                    数据发出后,对方没有接收完整,返回ACK告知发送方自己接受多少数据,然后发送方会再次进行缺失数据的发送以保证数据完整。

                       还可以进行流量控制。

                        关闭实现四次挥手,等待数据传输完毕才可以关闭

                特点:

                    1.实现机制复杂

                    2.资源开销大

                    3.安全可靠

    网络层:

        IPv4

        IP地址:唯一标识网络中一台主机的标号

        IP地址:网络位 + 主机位

        子网掩码:用来标识IP地址的网络位和主机位

                子网掩码是1的部分表示IP地址的网络位

                子网掩码是0的部分表示IP地址的主机位

        网段号:网络位不变,主机位全为0,表示网段号

        广播地址:网络位不变,主机位全为1,表示广播地址

端口号就是找电脑中是哪个软件需要接收信息

        IP地址类型:

        A类

            1.0.0.0 - 126.255.255.255

            子网掩码:255.0.0.0

            管理超大规模网络

            10.0.0.0 - 10.255.255.255 

        B类

            128.0.0.0 - 191.255.255.255

            子网掩码: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

        D类

            224.0.0.0 - 239.0.0.0

            用于组播

        E类

            240.0.0.0 - 255.255.255.255 

            用于实验

UDP编程

    socket套接字编程:

    1.发端:

        socket 

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

        功能:

            创建一个用来通信的文件描述符

        参数:

            domain:使用的协议族 AF_INET (IPv4协议族)  还有其他协议组,可在手册中查看。

            type:套接字类型

                SOCK_STREAM:流式套接字        tcp

                SOCK_DGRAM:数据报套接字  udp

                SOCK_RAW:原始套接字   协议

            protocol:协议

                默认为0 

        返回值:

            成功返回文件描述符

            失败返回-1 

        sendto 

        ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

                      const struct sockaddr *dest_addr, socklen_t addrlen);

        功能:

            利用套接字向指定地址发送数据信息 

        参数:

            sockfd:套接字文件描述符

            buf:发送数据空间首地址

            len:发送数据的长度

            flags:属性默认为0 

            dest_addr:目的地址信息存放的空间首地址

            addrlen:目的地址的长度(就是dest_addrlen的大小)

        

        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 */

        };

这是ipv4的协议结构体,要转换乘通用的要强制转化(struct sockaddr *)

        /* Internet address. */

        struct in_addr {

            uint32_t       s_addr;     /* address in network byte order */

        };

                  

        返回值:

            成功返回实际发送字节数

            失败返回-1 

        inet_addr:

        in_addr_t inet_addr(const char *cp);

        功能:  

            将字符串IP地址转换为内存中的IP地址 

        htons

        uint16_t htons(uint16_t hostshort);

        功能:

            将本地字节序转换为网络的大端字节序

        关闭close() 

Linux学习-网络UDP

1.recvfrom

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

                        struct sockaddr *src_addr, socklen_t *addrlen);

    功能:

        从套接字中接收数据

    参数:

        sockfd:套接字文件描述符

        buf:存放数据空间首地址

        flags:属性 默认为0 

        src_addr:存放IP地址信息的空间首地址

        addrlen:存放接收到IP地址大小空间的首地址

    返回值:

        成功返回实际接收字节数

        失败返回-1 

Linux学习-网络UDP

如果要接收收据要加上

ssize_t recv_len;

socklen_t len;

len = sizeof(s);

recv_len = recvfrom(sco_num, b, sizeof(b), 0, (struct sockaddr *)&s, &len);

传长度指针,是因为当接受完了之后,该指针指向的值会改正真正结收的地址的大小

2.修改虚拟机到桥接模式:

    点击"虚拟机"

    点击"设置"

    点击"网络适配器"

    选择"桥接模式"

    点击"确定"

3.将网卡桥接到无线网卡

    点击"编辑"

    点击"虚拟网络编辑器"

    点击"更改设置"

4.在Ubuntu中重启网络服务

    sudo /etc/init.d/networking restart 

    ifconfig

2.bind 

    int bind(int sockfd, const struct sockaddr *addr,

                socklen_t addrlen);

    功能:

        在套接字上绑定一个IP地址和端口号,只能绑定自己的IP地址

    参数:

        sockfd:套接字文件描述符

        addr:绑定IP地址空间首地址

        addrlen:绑定IP地址的长度

    返回值:

        成功返回0 

        失败返回-1 

3.UDP编程:

    发端:socket -> sendto -> close 

    收端: socket -> bind -> recvfrom -> close 

Linux学习-网络UDP

练习:

    编写程序实现两台主机间传输一个文件

    ./recv 

    

    ./send 

    a.txt 

Linux学习-网络UDP

4.UDP需要注意的细节点:

    1.UDP是无连接,发端退出,收端没有任何影响

    2.UDP发送数据上限,最好不要超过1500个字节

    3.UDP是不安全不可靠的,连续且快速的传输数据容易产生数据丢失

5.wireshark

  抓包工具

  操作流程:

    1.sudo wireshark

      打开wireshark抓包工具

    2.选择抓取数据包的网卡

      any

    3.执行通信的代码

    4.停止通信

    5.设定过滤条件

        ip.addr == IP地址 

        udp 

        tcp 

        udp.port == 端口

6.UDP包头长度:8个字节

    源端口号(2个字节)

    目的端口号(2个字节)

    长度(2个字节)

    校验和(2个字节)

 

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]