这几天重温了一下网络协议,感觉有必要记录一下。首先就是对于现在而言,网络分为7层,第一层为物理层,往后依次是链路层,网络层,传输层,会话层,表示层,应用层,而一般情况下可以把会话层,表示层,应用层整体看作一个应用层,最为经典的案例就是ip协议在网络层,tcp在传输层,http在应用层。
首先物理层是最底层的,就是负责传输信号,再往上一层的数据链路层拿到的就是01字串了,数据链路层负责侦测发送冲突,和辨认不同的数据帧的。一般我们通过抓包比如用wireshark之类的,或者用raw socket的进行编程时拿到的就是数据帧了。然后先来说一下数据帧的格式了。数据帧包括三部分数据头,数据,数据尾,数据头是14字节,包括6字节目的地址mac,6字节源地址mac和两字节的协议类型,一般是0x0080表示是ip协议,最后数据尾是4字节的crc校验。一般我们熟知的arp协议,ppp协议还有l2tp协议都是工作在数据链路层的。
然后就到了网络层了,网络层我们熟知的就是ip协议,有了ip协议之后数据包能够知道如何将数据包转发到合适的位置上。现在ip协议分为ipv4和ipv6,其中ipv4是说ip地址是32位的,一般表示为0.0.0.0-255.255.255.255,ipv6的地址是128位的通,常写作8组,每组为四个十六进制数的形式,如FE80:0000:0000:0000:AAAA:0000:00C2:0002。
先来看ipv4的协议包header结构。
-|------------->16<--------------|------------->16<--------------|
-|0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7|
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| vesion| IHL | TypeOfService | TotleLength |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| identification |flags| FragmentOffset |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
首先最开始的4bit,表示协议类型,因为是ipv4所以是4,之后的IHT是ip header的长度,一般情况下是5,是说header的大小是5*4=20字节,也就是说header最大长度是15*4=60字节,注意IHT最小就是5,因为没有额外信息时所有信息至少需要20字节存储。具体的协议内容可以查看rfc791。
再来看ipv6的数据包header格式。
-|------------->16<--------------|------------->16<--------------|
-|0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7|
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Traffic Class | Flow Label |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length | Next Header | Hop Limit |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
-+ +
| |
-+ Source Address +
| |
-+ +
| |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
-+ +
| |
-+ Destination Address +
| |
-+ +
| |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
可以看到ipv6的header协议简化了一些内容,而地址边更为128bit,也就是16字节了。具体可以查看rfc2460。
在网络层工作的协议有ip,icmp,IPsec,ping是用的icmp协议就是工作在网络层的。
去掉了ip数据头之后就到了传输层了。传输层我们比较熟悉的就是tcp协议和udp协议了,这两个都是传输协议,而且一般情况下tcp和udp都有成熟的socket接口一般不需要自己去解析数据包格式了,所以这里不在赘述了,比如SOCK_STREAM是基于TCP的,SOCK_DGRAM是基于UDP的。TCP是数据保障的传输协议,而UDP则不保证数据传输的可靠。
然后最后就是应用层的数据协议了,这一层的协议就开始丰富起来了,比如http,ftp,dhcp,dns等。
最近还看到一个比较常用但是一直没有注意的socks5协议,详细内容可以看rfc1928,socks5也是应用层的协议,相对于我们说的五层网络而言,而对于7层网络而言,他是工作在会话层的,而这个协议也基本是作为proxy的存在,在去除掉传输层的协议就是tcp或udp的协议之后就能看到scocks5的协议内容,再往下会有http,ftp等协议,所以作为proxy而言,socks5协议不但比较简洁,而且对于更上层的协议如http,ftp等能更方便的转发。