网络协议栈7:connect()函数之前之IP

网络协议栈7:connect()函数之前之IP

Tcp的下一层,就是IPinternet protocol,网络协议),IP的结构图和结构体如下:

 

Ip首部结构体

struct iphdr {

#if defined(LITTLE_ENDIAN_BITFIELD)

   __u8 ihl:4,/*首部长度*/

     version:4;/*版本号,V4、V6*/

#elif defined (BIG_ENDIAN_BITFIELD)

   __u8 version:4,

     ihl:4;

#else

#error  "Please fix <asm/byteorder.h>"

#endif

   __u8 tos;/*服务类型*/

   __u16   tot_len;/*总长度*/

   __u16   id;/*标志位=标志控制位+分片偏移*/

   __u16   frag_off;/**/

   __u8 ttl;/*生存时间,由经过的每一个路由器将这个字段的值减 1*/

   __u8 protocol;/*上层协议字段:UDP/TCP......*/

   __u16   check;/*校验和*/

   __u32   saddr;/*源端IP地址*/

   __u32   daddr;/*目的端IP地址*/

   /*The options start here. */

};

IP首部主要记录了链路连接两端的IP地址,也就相当于记录了两个网卡,而一般情况下,也等于记录两台主机。

我们知道,在windows/linux操作系统下,网卡的IP地址是可以任意设置的,比如在同一网段下,可以把网卡IP设置成192.168.1.2,也可以设置成192.168.1.100等等,但是这两个IP所代表的都是同一张网卡,可以任意设置的IP地址是如何代表了同一张网卡呢?原因是这样的,由于每张网卡本身都有一个物理地址,一般情况下这个物理地址是被写在网卡的固件里的,是修改不了的,(其实有些是可以改动的,但只要保证在同一网段中没有两张网卡使用相同的物理地址即可),而可以改变的IP地址,总是关联到不可以改变的物理地址上的,所以,我们总有办法通过可变的IP地址,找到固定的物理地址,进而使用这个唯一的物理地址作为唯一的地址进行接收和发送,这个过程就是ARPaddress resolution protocol,地址解析协议),通过IP地址,以广播的形式在网络中查找对应于这个IP地址的物理地址。

IP协议的目的,就是根据上层协议的类型,尽快的把数据传输到对应的协议,由对应的协议来进行处理,比如TCP协议,或者UDP协议,而它不对数据进行处理(防火墙除外),或者在下传数据时,尽快的把数据传送给链路层,而保证数据的准确性等,都不是它的功能,它主要功能,就是尽可以快的把数据发送出去,是一个承上启下的层次。

posted on 2012-01-08 11:01  image eye  阅读(763)  评论(0编辑  收藏  举报