TCP/IP学习(1)-tcp报文

2023-05-23  本文已影响0人  温岭夹糕

1.参考教材和源码

  1. 《TCP/IP详解 卷1:协议》--第17章170页开始
  2. 《TCP/IP详解 卷2:实现》--第24章636页开始
  3. 乾颐堂现任明教教主 TCPIP协议详解
  4. linux内核源码tcp部分

2.TCP:传输控制协议

2.1TCP服务

TCP提供的是一种面向连接的(全双工),可靠的字节流服务,具体表现在:

另外TCP对字节流不做任何解释,不管传输的数据是字节流还剩ASCII字符等,需要两端自己协商(将对数据的解释权丢给应用层)

2.2TCP报文首部

image
  1. 首先我们关注前8个字节,即源端口号sport,目标端口号dport和序列号seq,这三个能确定一个TCP报文。linux编程中的socket就是指ip+端口。

四元组:源目(发送方和目标)ip、源目端口
五元组:源目ip、源目端口、协议号

  1. 确认序列号(seq p2)为源报文序列号(seq p1)加上数据长度。若数据100位则seq p2=seq p1+100;若不包含数据,则说明该报文p1是用于建立连接/断开连接等功能的,后6位标志位其中一位被置为1(也有可能是多个标志位被置为1),相当于该报文携带的数据是标志位,则seq p2 = seq p1+1(标志位占1位)
  2. 窗口大小用于流量控制,一般表示接收方的缓存大小,但是目前2^16-1大小的窗口大小已经不够我们当代的通讯使用,所以还会与一个窗口扩大因子挂钩。
  3. 6个标志比特位。主要常用4个ack确认、rst重连、syn建立连接、fin完成发送

2.3查看首部源码

tcp头部tcphdr结构体被定义在头文件tcp.h中

struct tcphdr {
    __be16  source;//源端口 16位1-65535
    __be16  dest;//目标端口 16位
    __be32  seq;//序列号 32位
    __be32  ack_seq;
#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;//紧急指针
};

上面doff和res1有两种排序是因为大端和小端的原因
其中数据类型,后面的数字表示其占用的位大小

typedef unsigned short      u16;
typedef unsigned short      _u16;
typedef unsigned int        u32;
typedef u32 _be32
typedef u16 _be16
 typedef _u16 _sum16
image.png
上一篇下一篇

猜你喜欢

热点阅读