网络协议栈7:connect()函数之前之IP
网络协议栈7:connect()函数之前之IP
Tcp的下一层,就是IP(internet 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地址,找到固定的物理地址,进而使用这个唯一的物理地址作为唯一的地址进行接收和发送,这个过程就是ARP(address resolution protocol,地址解析协议),通过IP地址,以广播的形式在网络中查找对应于这个IP地址的物理地址。
IP协议的目的,就是根据上层协议的类型,尽快的把数据传输到对应的协议,由对应的协议来进行处理,比如TCP协议,或者UDP协议,而它不对数据进行处理(防火墙除外),或者在下传数据时,尽快的把数据传送给链路层,而保证数据的准确性等,都不是它的功能,它主要功能,就是尽可以快的把数据发送出去,是一个承上启下的层次。