• Linux基础编程之网络基础编程一


    1.OSI模型及TCP/IP协议模式

    2 TCP/IP体系结构分层

    以http协议为例,客户端向服务器发送一个http包,首先上http包头+数据作为TCP包的数据,再加上TCP包头作为IP包的数据,再加上MAC包头,发送至服务端。同理,服务端接受到此数据包也需要分层拆解。下图是发送接受模型。

    3 数据包拆分流程图

    4 以太网链路层格式

    5 各层包头信息

         IP包头

    //come from /usr/include/linux/ip.h
    struct iphdr {
    #if defined(__LITTLE_ENDIAN_BITFIELD)                     //小端定义方式
        __u8    ihl:4,                                                         //表头长度
            version:4;                                                         //版本
    #elif defined (__BIG_ENDIAN_BITFIELD)                     //大端时
        __u8    version:4,
              ihl:4;
    #else
    #error    "Please fix <asm/byteorder.h>"
    #endif
        __u8    tos;                                                              //服务类型
        __be16    tot_len;                                                       //总长度
        __be16    id;                                                                //识别码
        __be16    frag_off;                                                      //分段位移
        __u8    ttl;                                                               //存活值
        __u8    protocol;                                                     //协议代码
        __sum16    check;                                                        //校验码
        __be32    saddr;                                                           //源IP地址
        __be32    daddr;                                                         //目的IP地址
        /*The options start here. */
    };

       TCP包头

    //come from /usr/include/linux/tcp.h
    #ifndef _LINUX_TCP_H
    #define _LINUX_TCP_H
    
    #include <linux/types.h>
    #include <asm/byteorder.h>
    #include <linux/socket.h>
    
    struct tcphdr {
        __be16    source;                                                       //源端口号
        __be16    dest;                                                          //目的端口号
        __be32    seq;                                                           //封装序号
        __be32    ack_seq;                                                   // ACK序号
    #if defined(__LITTLE_ENDIAN_BITFIELD)                   //小端时
        __u16    res1:4,                                                       //
            doff:4,
            fin:1,                                                                   //传输结束
            syn:1,                                                                 //确认同步
            rst:1,
            psh:1,
            ack:1,                                                               //确认数据包
            urg:1,                                                               //紧急数据包
            ece:1,
            cwr:1;
    #elif defined(__BIG_ENDIAN_BITFIELD)                       //大端时
        __u16    doff:4,
            res1:4,
            cwr:1,
            ece:1,
            urg:1,
            ack:1,
            psh:1,
            rst:1,
            syn:1,
            fin:1;
    #else
    #error    "Adjust your <asm/byteorder.h> defines"
    #endif    
        __be16    window;                                                        //滑动窗口大小
        __sum16    check;                                                          //校验码
        __be16    urg_ptr;                                                        //紧急信息
    };

    UDP包头

    // come from /usr/include/linux/udp.h
    #ifndef _LINUX_UDP_H
    #define _LINUX_UDP_H
    
    #include <linux/types.h>
    
    struct udphdr {
        __be16    source;                             //源端口号
        __be16    dest;                                 //目的端口号
        __be16    len;                                  //长度 
        __sum16    check;                              //校验码
    };
  • 相关阅读:
    士兵杀死(两)(南阳116)
    Android 墙纸设置代码 详细说明
    Laravel nginx 伪静态规则
    STL源代码分析——STL算法merge合并算法
    第29周六
    第29周五
    第29周四
    第29周三
    2014第29周二
    第29周一
  • 原文地址:https://www.cnblogs.com/haibiandemoumoumou/p/14358843.html
Copyright © 2020-2023  润新知