python用socket解析数据包的问题

用python做个抓包工具,下面有写代码不明白,请老师指点一下.

 while True: 
    packet = s.recvfrom(65565) 
    packet = packet[0]  
    ip_header = packet[0:20] 
    iph = unpack('!BBHHHBBH4s4s' , ip_header) 

    version_ihl = iph[0] 
    version = version_ihl >> 4 
    ihl = version_ihl & 0xF 
    iph_length = ihl * 4 
    ttl = iph[5] 
    protocol = iph[6] 
    s_addr = socket.inet_ntoa(iph[8]); 
    d_addr = socket.inet_ntoa(iph[9]); 

问题1:这里面的iph = unpack('!BBHHHBBH4s4s' , ip_header)是什么意思,必须是BBHHHBBH4s4s吗?

问题2:version = version_ihl >> 4是什么意思? '>>'是什么符号?

问题3:ihl = version_ihl & 0xF是什么意思?

问题4:s_addr = socket.inet_ntoa(iph[8])是转换ip的吗?
本人初学python,没有分数,请各位老师不吝赐教,万分感激.

unpack是按包格式协议来解析对我。

是移位操作。
&是取最后四位
获取转换IP地址