linux 1.2.8 tcp 三次握手


TCP建立连接时有3次握手,今天在kernel中验证下,

修改linux-1.2.8的drivers/net/loopback.c,内核会将lo的包输出到 /var/adm/messages中

static int loopback_xmit(struct sk_buff *skb, struct device *dev) {
    .....
    int index = 0;
    for(; index < skb->len; index++) 
        printk("0x%x ", skb->data[index]);
    printk("\n");
    ......
}
运行ftp程序,建立tcp连接,获取输出的传输数据:
Aug  6 03:00:43 test kernel: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x8 0x0 0x45 0x0 0x0 0x2c 0x0 0xc 0x0 0x0 0x40 0x6 0x7c 0xbe 0x7f 0x0 0x0 0x1 0x7f 0x0 0x0 0x1 0x4 0x4 0x0 0x15 0x60 0x79 0xbd 0x9d 0x0 0x0 0x0 0x0 0x60 0x2 0x2 0x0 0x74 0x18 0x0 0x0 0x2 0x4 0x7 0x90 
Aug  6 03:00:43 test kernel: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x8 0x0 0x45 0x0 0x0 0x2c 0x0 0xd 0x0 0x0 0x40 0x6 0x7c 0xbd 0x7f 0x0 0x0 0x1 0x7f 0x0 0x0 0x1 0x0 0x15 0x4 0x4 0x60 0x79 0xbd 0xb5 0x60 0x79 0xbd 0x9e 0x60 0x12 0x37 0xff 0x1f 0xd9 0x0 0x0 0x2 0x4 0x7 0x90 
Aug  6 03:00:43 test kernel: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x8 0x0 0x45 0x0 0x0 0x28 0x0 0xe 0x0 0x0 0x40 0x6 0x7c 0xc0 0x7f 0x0 0x0 0x1 0x7f 0x0 0x0 0x1 0x4 0x4 0x0 0x15 0x60 0x79 0xbd 0x9e 0x60 0x79 0xbd 0xb6 0x50 0x10 0x37 0xb6 0x39 0xbb 0x0 0x0 

Eth帧结构图</FONT>


IP数据包帧格式</FONT>


TCP首部的数据格式</FONT>


</pre>

下面是运行ftp的kernel输出,参考上面的结构图,前三次握手如下:

![pic](https://fillzero.github.io/assets/2014_10_08_tcp_connection.jpg)

其中的位码即tcp标志位,有6种标示:
SYN(synchronous建立联机) 
ACK(acknowledgement 确认) 
PSH(push传送) 
FIN(finish结束) 
RST(reset重置) 
URG(urgent紧急)

0x2: 表示SYN置1
0x12: 表示ACK SYN置1
0x10: 表示ACK置1
上面的分析正好对应了3次握手的简化图: ![pic](https://fillzero.github.io/assets/2014_10_08_tcp_connection2.jpg)

上篇: linux 1.2.8 network 下篇: 动手写操作系统 -- 前言