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;                              //校验码
};
原文地址:https://www.cnblogs.com/haibiandemoumoumou/p/14358843.html