<head>
<title> 三级下拉菜单 (通用版)</title>
<meta http-equiv="Content-Type" content="text/html charset=gb2312">
</head>
<body>
<SCRIPT LANGUAGE="JavaScript">
function CreateSelect(_FormName,_SName,_SValue,_Ds,_AllOptionStr,ShowType)
{
if (_FormName=="")
_FormName = "all"
var _DsArr = _Ds.split("|")
var _Ds1,_Ds2,_Ds3
var _Ds1 = _DsArr[0]
var _Ds2 = (_DsArr.length>1)?_DsArr[1]:_DsArr[0]
var _Ds3 = (_DsArr.length>2)?_DsArr[2]:_DsArr[0]
var _SNameArr = _SName.split("|")
var _SName1,_SName2,_SName3
var _SName1 = _SNameArr[0]
var _SName2 = (_SNameArr.length>1)?_SNameArr[1]:_SNameArr[0]
var _SName3 = (_SNameArr.length>2)?_SNameArr[2]:_SNameArr[0]
var _SValueArr = _SValue.split("|")
var _SValue1,_SValue2,_SValue3
var _SValue1 = _SValueArr[0]
var _SValue2 = (_SValueArr.length>1)?_SValueArr[1]:_SValueArr[0]
var _SValue3 = (_SValueArr.length>2)?_SValueArr[2]:_SValueArr[0]
if (ShowType==3){
_AllOptionStr = _AllOptionStr.replace(/\(\(/ig,"\(\("+_Ds3+"\^")
_AllOptionStr = _AllOptionStr.replace(/\{\{/ig,"\{\{"+_Ds2+"\(\("+_Ds3+"\*\*")
}
else if(ShowType==2){
_AllOptionStr = _AllOptionStr.replace(/\{\{/ig,"\{\{"+_Ds2+"\(\("+_Ds3+"\*\*")
}
else if(ShowType==1){
_AllOptionStr = _AllOptionStr.replace(/\(\(/ig,"\(\("+_Ds3+"\^")
}
var AllStr = _Ds1 + "{{"+ _Ds2 + "(("+ _Ds3 +"||"+_AllOptionStr
var _AR0 = AllStr.split("||")
document.writeln("<select name=\"" + _SName1 + "\" size=\"1\" onChange=\""+_SName1+"redirect(this.options.selectedIndex)\">")
for (var i1 = 0i1 < _AR0.lengthi1++)
{
var Area1Str = _AR0[i1]
var _AR10 = Area1Str.split("{{")
var _AR11 = _AR10[0].split("@")
var Tstr1 = _AR11[0]
var Vstr1 = (_AR11.length==2)?_AR11[1]:_AR11[0]
document.writeln("<option value=\""+Vstr1+"\">"+Tstr1+"<\/option>")
}
document.writeln("<\/select>")
document.writeln("<select name=\"" + _SName2 + "\" size=\"1\" onChange=\""+_SName1+"redirect1(this.options.selectedIndex)\">")
var _AR111 = _Ds2.split("@")
var Tstr11 = _AR111[0]
var Vstr11 = (_AR111.length==2)?_AR111[1]:_AR111[0]
document.writeln("<option value=\""+Vstr11+"\">"+Tstr11+"<\/option>")
document.writeln("<\/select>")
document.writeln("<select name=\"" + _SName3 + "\" size=\"1\">")
var _AR222 = _Ds3.split("@")
var Tstr22 = _AR222[0]
var Vstr22 = (_AR222.length==2)?_AR222[1]:_AR222[0]
document.writeln("<option value=\""+Vstr22+"\">"+Tstr22+"<\/option>")
document.writeln("<\/select>")
document.writeln("<S"+"CRIPT LANGUAGE=\"JavaScript\" defer>")
document.writeln("<!--")
document.writeln("var "+_SName1+"NewAllStr = \""+ AllStr +"\"")
document.writeln("var "+_SName1+"_AR0 = "+_SName1+"NewAllStr.split(\"||\")")
document.writeln("var "+_SName1+"groups=document."+ _FormName +"." + _SName1 + ".options.length")
document.writeln("var "+_SName1+"group=new Array("+_SName1+"groups)")
document.writeln("for (i=0 i<"+_SName1+"groups i++){")
document.writeln(" "+_SName1+"group[i]=new Array()")
document.writeln("}")
document.writeln("for (var i1 = 0i1 < "+_SName1+"_AR0.lengthi1++){")
document.writeln(" var Area1Str = "+_SName1+"_AR0[i1]")
document.writeln(" var _AR10 = Area1Str.split(\"{{\")")
document.writeln(" var _AR12 = _AR10[1].split(\"**\")")
document.writeln(" for (var i2 = 0i2 < _AR12.lengthi2++){")
document.writeln(" var Area2Str = _AR12[i2]")
document.writeln(" var _AR20 = Area2Str.split(\"((\")")
document.writeln(" var _AR211 = _AR20[0].split(\"@\")")
document.writeln(" var Tstr2 = _AR211[0]")
document.writeln(" var Vstr2 = (_AR211.length==2)?_AR211[1]:_AR211[0]")
document.writeln(" "+_SName1+"group[i1][i2]=new Option(Tstr2,Vstr2)")
document.writeln(" }")
document.writeln("}")
document.writeln("var "+_SName1+"temp = document."+ _FormName +"." + _SName2)
document.writeln("function "+_SName1+"redirect(x){")
document.writeln(" for (m="+_SName1+"temp.options.length-1m>0m--)")
document.writeln(" "+_SName1+"temp.options[m]=null")
document.writeln(" for (i=0i<"+_SName1+"group[x].lengthi++){")
document.writeln(" "+_SName1+"temp.options[i]=new Option("+_SName1+"group[x][i].text,"+_SName1+"group[x][i].value)")
document.writeln(" }")
document.writeln(" "+_SName1+"temp.options[0].selected=true")
document.writeln(" "+_SName1+"redirect1(0)")
document.writeln("}")
document.writeln("var "+_SName1+"Group2s=document."+ _FormName +"." + _SName2 + ".options.length")
document.writeln("var "+_SName1+"Group2=new Array("+_SName1+"groups)")
document.writeln("for (i=0 i<"+_SName1+"groups i++){")
document.writeln(" "+_SName1+"Group2[i]=new Array("+_SName1+"group[i].length)")
document.writeln(" for (j=0 j<"+_SName1+"group[i].length j++){")
document.writeln(" "+_SName1+"Group2[i][j]=new Array()")
document.writeln(" }")
document.writeln("}")
document.writeln("for (var i1 = 0i1 < "+_SName1+"_AR0.lengthi1++){")
document.writeln(" var Area1Str = "+_SName1+"_AR0[i1]")
document.writeln(" var _AR10 = Area1Str.split(\"{{\")")
document.writeln(" var _AR12 = _AR10[1].split(\"**\")")
document.writeln(" for (var i2 = 0i2 < _AR12.lengthi2++){")
document.writeln(" var Area2Str = _AR12[i2]")
document.writeln(" var _AR20 = Area2Str.split(\"((\")")
document.writeln(" _AR212 = _AR20[1].split(\"^\")")
document.writeln(" for (var i3 = 0i3 < _AR212.lengthi3++){")
document.writeln(" Area3Str = _AR212[i3]")
document.writeln(" _AR3 = Area3Str.split(\"@\")")
document.writeln(" Tstr3 = _AR3[0]")
document.writeln(" Vstr3 = (_AR3.length==2)?_AR3[1]:_AR3[0]")
document.writeln(" "+_SName1+"Group2[i1][i2][i3]=new Option(Tstr3,Vstr3)")
document.writeln(" }")
document.writeln(" }")
document.writeln("}")
document.writeln("var "+_SName1+"temp1=document."+ _FormName +"." + _SName3 + "")
document.writeln("function "+_SName1+"redirect1(y){")
document.writeln(" for (m="+_SName1+"temp1.options.length-1m>0m--)")
document.writeln(" "+_SName1+"temp1.options[m]=null")
document.writeln(" for (i=0i<"+_SName1+"Group2[document."+ _FormName +"." + _SName1 + ".options.selectedIndex][y].lengthi++){")
document.writeln(" "+_SName1+"temp1.options[i]=new Option("+_SName1+"Group2[document."+ _FormName +"." + _SName1 + ".options.selectedIndex][y][i].text," + _SName1 + "Group2[document."+ _FormName +"." + _SName1 + ".options.selectedIndex][y][i].value)")
document.writeln(" }")
document.writeln(" "+_SName1+"temp1.options[0].selected=true")
document.writeln("}")
document.writeln("\/\/-->")
document.writeln("<\/script>")
document.writeln("<s"+"cript language=\"JavaScript\">")
document.writeln("<!--")
document.writeln("function "+_SName1+"SetValue(){")
document.writeln(" try{")
document.writeln(" if (\""+_SValue1+"\"!=\"\"){")
document.writeln(" document."+ _FormName +"."+_SName1+".value=\""+_SValue1+"\"")
document.writeln(" "+_SName1+"redirect(document."+ _FormName +"."+_SName1+".options.selectedIndex)")
document.writeln(" if (\""+_SValue2+"\"!=\"\"){")
document.writeln(" document."+ _FormName +"."+_SName2+".value=\""+_SValue2+"\"")
document.writeln(" "+_SName1+"redirect1(document."+ _FormName +"."+_SName2+".options.selectedIndex)")
document.writeln(" if (\""+_SValue3+"\"!=\"\")")
document.writeln(" document."+ _FormName +"."+_SName3+".value=\""+_SValue3+"\"")
document.writeln(" }")
document.writeln(" }")
document.writeln(" }")
document.writeln(" catch(e){")
document.writeln(" }")
document.writeln("}")
document.writeln("window.attachEvent(\"onload\","+_SName1+"SetValue)")
document.writeln("\/\/-->")
document.writeln("<\/script>")
}
</script>
<SCRIPT LANGUAGE="JavaScript">
<!--
var AllStr1 = ""
+"东北地区{{"
+"黑龙江((哈尔滨^齐齐哈尔^牡丹江^佳木斯^大庆^绥化^鹤岗^鸡西^黑河^双鸭山^伊春^七台河^大兴安岭"
+"**吉林((长春^吉林^四平^辽源^通化^白山^松原^白城^延边"
+"**辽宁((沈阳^大连^鞍山^抚顺^本溪^丹东^锦州^营口^阜新^辽阳^盘锦^铁岭^朝阳^葫芦岛"
+"||华北地区{{"
+"北京((东城^西城^崇文^宣武^朝阳^丰台^石景山^海淀^门头沟^房山^通州^顺义^昌平^大兴^平谷^怀柔^密云^延庆"
+"**天津((和平^东丽^河东^西青^河西^津南^南开^北辰^河北^武清^红挢^塘沽^汉沽^大港^宁河^静海^宝坻^蓟县"
+"**山东((济南^青岛^淄博^枣庄^东营^烟台^潍坊^济宁^泰安^威海^日照^莱芜^临沂^德州^聊城^滨州^菏泽"
+"**河北((石家庄^邯郸^邢台^保定^张家口^承德^廊坊^唐山^秦皇岛^沧州^衡水"
+"**河南((郑州^开封^洛阳^平顶山^安阳^鹤壁^新乡^焦作^濮阳^许昌^漯河^三门峡^南阳^商丘^信阳^周口^驻马店^济源"
+"**山西((太原^大同^阳泉^长治^晋城^朔州^吕梁^忻州^晋中^临汾^运城"
+"**内蒙古((呼和浩特^包头^乌海^赤峰^呼伦贝尔盟^阿拉善盟^哲里木盟^兴安盟^乌兰察布盟^锡林郭勒盟^巴彦淖尔盟^伊克昭盟"
+"||华中地区{{"
+"湖北((武汉^宜昌^荆州^襄樊^黄石^荆门^黄冈^十堰^恩施^潜江^天门^仙桃^随州^咸宁^孝感^鄂州"
+"**湖南((长沙^常德^株洲^湘潭^衡阳^岳阳^邵阳^益阳^娄底^怀化^郴州^永州^湘西^张家界"
+"||华南地区{{"
+"广东((广州^深圳^珠海^汕头^东莞^中山^佛山^韶关^江门^湛江^茂名^肇庆^惠州^梅州^汕尾^河源^阳江^清远^潮州^揭阳^云浮"
+"**广西((南宁^柳州^桂林^梧州^北海^防城港^钦州^贵港^玉林^南宁地区^柳州地区^贺州^百色^河池"
+"**福建((福州^厦门^莆田^三明^泉州^漳州^南平^龙岩^宁德"
+"**海南((海口^三亚"
+"||西南地区{{"
+"四川((成都^绵阳^德阳^自贡^攀枝花^广元^内江^乐山^南充^宜宾^广安^达川^雅安^眉山^甘孜^凉山^泸州"
+"**重庆((万州^涪陵^渝中^大渡口^江北^沙坪坝^九龙坡^南岸^北碚^万盛^双挢^渝北^巴南^黔江^长寿^綦江^潼南^铜梁^大足^荣昌^壁山^梁平^城口^丰都^垫江^武隆^忠县^开县^云阳^奉节^巫山^巫溪^石柱^秀山^酉阳^彭水^江津^合川^永川^南川"
+"**贵州((贵阳^六盘水^遵义^安顺^铜仁^黔西南^毕节^黔东南^黔南"
+"**云南((昆明^大理^曲靖^玉溪^昭通^楚雄^红河^文山^思茅^西双版纳^保山^德宏^丽江^怒江^迪庆^临沧"
+"**西藏((拉萨^日喀则^山南^林芝^昌都^阿里^那曲"
+"||西北地区{{"
+"陕西((西安^宝鸡^咸阳^铜川^渭南^延安^榆林^汉中^安康^商洛"
+"**甘肃((兰州^嘉峪关^金昌^白银^天水^酒泉^张掖^武威^定西^陇南^平凉^庆阳^临夏^甘南"
+"**宁夏((银川^石嘴山^吴忠^固原"
+"**青海((西宁^海东^海南^海北^黄南^玉树^果洛^海西"
+"**新疆((乌鲁木齐^石河子^克拉玛依^伊犁^巴音郭勒^昌吉^克孜勒苏柯尔克孜^博尔塔拉^吐鲁番^哈密^喀什^和田^阿克苏"
+"||华东地区{{"
+"上海((黄浦^卢湾^徐汇^长宁^静安^普陀^闸北^虹口^杨浦^闵行^宝山^嘉定^浦东^金山^松江^青浦^南汇^奉贤^崇明"
+"**江苏((南京^镇江^苏州^南通^扬州^盐城^徐州^连云港^常州^无锡^宿迁^泰州^淮安"
+"**浙江((杭州^宁波^温州^嘉兴^湖州^绍兴^金华^衢州^舟山^台州^丽水"
+"**安徽((合肥^芜湖^蚌埠^马鞍山^淮北^铜陵^安庆^黄山^滁州^宿州^池州^淮南^巢湖^阜阳^六安^宣城^亳州"
+"**江西((南昌市^景德镇^九江^鹰潭^萍乡^新馀^赣州^吉安^宜春^抚州^上饶"
+"||港澳台地区{{"
+"香港((香港"
+"**澳门((澳门"
+"**台湾((台北^高雄^台中^台南^屏东^南投^云林^新竹^彰化^苗栗^嘉义^花莲^桃园^宜兰^基隆^台东^金门^马祖^澎湖"
+"||其它地区{{"
+"其它((其它"
</SCRIPT>
<FORM name="HwForm">
<HR>选择一次<br>
<SCRIPT LANGUAGE="JavaScript">
CreateSelect("","S_13|S_23|S_33","","请选择地区@|请选择省份@|请选择城市@",AllStr1,0)
</SCRIPT>
<HR>选择三次<br>
<SCRIPT LANGUAGE="JavaScript">
CreateSelect("HwForm","S_1|S_2|S_3","华北地区|山东|济宁","请选择地区@|请选择省份@|请选择城市@",AllStr1,3)
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
<!--
var AllStr2 = ""
+"笔记本{{"
+"IBM((R32^T40^T42"
+"**DELL((N600^M600"
+"||数码相机{{"
+"CANON((A75^A80^A85"
+"**SONY((S80^S60"
</SCRIPT>
<HR>选择二次<br><SCRIPT LANGUAGE="JavaScript">
CreateSelect("HwForm","S_11|S_21|S_31","笔记本|IBM|T42","请选择分类@|请选择品牌@|请选择系列@",AllStr2,2)
</SCRIPT>
<HR>选择二次<br><SCRIPT LANGUAGE="JavaScript">
CreateSelect("HwForm","S_12|S_22|S_32","","请选择分类@|请选择品牌@|请选择系列@",AllStr2,1)
</SCRIPT>
</FORM>
</body>
</html>
引入js 测试一下,希望对你有帮助
Pcap文件详解一、简介
pcap文件是常用的数据报存储格式,可以理解为就是一种文件格式,只不过里面的数据是按照特定格式存储的,所以我们想要解析里面的数据,也必须按照一定的格式。
普通的记事本打开pcap文件显示的是乱码,用安装了HEX-Editor插件的Notepad++打开,能够以16进制数据的格式显示,或者使用sublime打开以十六进制的格式显示。用wireshark这种抓包工具就可以正常打开这种文件,愉快地查看里面的网络数据报了,同时wireshark也可以生成这种格式的文件。
还有一些其他网络分析工具。
二、文件格式
Pcap header
Packet1 header
Packet1 Data
Packet2 header
Packet2 Data
如上图所示,pcap文件的总体结构就是文件头-数据包头1-数据包1-数据包头2-数据包2的形式
1.Pcap Header
文件头,每一个pcap文件只有一个文件头,总共占24(B)字节,以下是总共7个字段的含义。(一个字节可以由2个十六进制表示)
Magic(4B):标记文件开始,并用来识别文件和字节顺序。值可以为0xa1b2c3d4或者0xd4c3b2a1,如果是0xa1b2c3d4表示是大端模式,按照原来的顺序一个字节一个字节的读,如果是0xd4c3b2a1表示小端模式,下面的字节都要交换顺序。现在的电脑大部分是小端模式。
ps:网络字节序一般是大端存储,主机x86字节序一般是小端存储,比如我们经过网络发送0x12345678这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放
Major(2B):当前文件的主要版本号,一般为0x0200
Minor(2B):当前文件的次要版本号,一般为0x0400
ThisZone(4B):当地的标准事件,如果用的是GMT则全零,一般全零
SigFigs(4B):时间戳的精度,一般为全零
SnapLen(4B):最大的存储长度,该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535(0xFFFF); 例如:想获取数据包的前64字节,可将该值设置为64
LinkType(4B):链路类型
2.Packet Header
数据包头可以有多个,每个数据包头后面都跟着真正的数据包。数据包头则依次为:时间戳(秒)、时间戳(微妙)、抓包长度和实际长度,依次各占4个字节。以下是Packet Header的4个字段含义
Timestamp(4B):时间戳高位,精确到seconds,这是Unix时间戳。捕获数据包的时间一般是根据这个值
Timestamp(4B):时间戳低位,能够精确到microseconds
Caplen(4B):当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
Len(4B):离线数据长度,网路中实际数据帧的长度,一般不大于Caplen,多数情况下和Caplen值一样
3.Packet Data
Packet是链路层的数据帧,长度就是Packet Header中定义的Caplen值,所以每个Packet Header后面都跟着Caplen长度的Packet Data。也就是说pcap文件并没有规定捕获的数据帧之间有什么间隔字符串。Packet数据帧部分的格式就是标准的网络协议格式了。
例子:
红色部分是Pcap Header,蓝色部分是Packet Header,后边是Packet Date
Pcap Header的Magic:d4 c3 b2 a1,表示是小端模式,后面的字节从后往前读 a1b2c3d4 小端模式
Pcap Header的Major:02 00,计算机读的应该是00 02。最大存储长度SnapLen:ff ff 00 00 ,同理计算机读的应该是00 00 ff ff,所以是2的16次方减一,是65535个字节。LinkType:01 00 00 00 ,实际是00 00 00 01,是以太网类型。
蓝色部分的Packet Header我就不一一说了,重点关注Caplen:3c 00 00 00,计算机读的是00 00 00 3c,转换成十进制就是60,所以后面的60个字节都是一个数据帧。之后就又是一个Pcap Header,如此循环。
三、以太网帧(Ethernet)、IP包、TCP、UDP的长度范围
1、以太网帧
MAC地址则是48位的(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如08:00:20:0A:8C:6D就是一个MAC地址。
以太网地址头部:目的地址(6字节)、源地址(6字节)、以太网类型(2字节)
目前以太网帧有5种,交换机之间BPDU(桥协议数据单元)数据包使用的是IEEE802.3/LLC帧,其格式如下:
字段 长度(字节) 目的
前导码(Preamble) 7 0x55,一串1、0间隔,用于信号同步
帧开始符(SFD) 1 1字节0xD5(10101011),表示一帧开始
目的MAC地址 6 指明帧的接受者
源MAC地址 6 指明帧的发送者
长度(Length)/类型(Type) 2 0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF)
数据和填充(Data and Pad) 46~1500 高层的数据,通常为3层协议数据单元。对于TCP/IP是IP数据包(注:如果帧长小于64字节,则要求“填充”,以使这个帧的长度达到64字节)
帧校验序列(FCS) 4 使用CRC计算从目的MAC到数据域这部分内容而得到的校验和
以太网MAC帧格式
在Linux中,以太网帧头部的结构体如下:
/ 10Mb/s ethernet header /
struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]/ destination eth addr /
u_int8_t ether_shost[ETH_ALEN]/ source ether addr /
u_int16_t ether_type / packet type ID field /
} __attribute__ ((__packed__))
其中的ETH_ALEN为6,因为地址为6个字节,共48位——这个地址就是常说的物理地址,或MAC地址。它的第3个成员ether_type是以太帧类型,有如下这些:
/ Ethernet protocol ID's /
#define ETHERTYPE_PUP 0x0200 / Xerox PUP /
#define ETHERTYPE_SPRITE 0x0500 / Sprite /
#define ETHERTYPE_IP 0x0800 / IP /
#define ETHERTYPE_ARP 0x0806 / Address resolution /
#define ETHERTYPE_REVARP 0x8035 / Reverse ARP /
#define ETHERTYPE_AT 0x809B / AppleTalk protocol /
#define ETHERTYPE_AARP 0x80F3 / AppleTalk ARP /
#define ETHERTYPE_VLAN 0x8100 / IEEE 802.1Q VLAN tagging /
#define ETHERTYPE_IPX 0x8137 / IPX /
#define ETHERTYPE_IPV6 0x86dd / IP protocol version 6 /
#define ETHERTYPE_LOOPBACK 0x9000 / used to test interfaces /
注:如果帧长小于64字节,则要求“填充”,以使这个帧的长度达到64字节
但是我们观察到这个以太网帧只有60字节,why?
据RFC894的说明,以太网封装IP数据包的最大长度是1500字节(所以,数据链路层的最大传输单元(Maximum Transmission Unit,MTU)是1500字节),也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步吗+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的FCS。
按照上述,最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,只留下了目的地址,源地址,类型字段,其最大值是6+6+2+1500=1514。
以太网规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。不同的抓包程序和设备驱动程序所处的优先层次可能不同,抓包程序的优先级可能比设备驱动程序更高,也就是说,我们的抓包程序可能在设备驱动程序还没有填充不到64字节帧的时候,已经捕获了数据。因此不同的抓包工具抓到的数据帧的大小可能不同。(比如,wireshark抓到的可能没有填充数据段,而sniffer抓到的就有填充数据段)
2、IP数据包
IP头大小最小为20字节。所以,网络层的MTU=数据链路层的MTU1500-20=1480字节。
由于IP协议提供为上层协议分割和重组报文的功能,在IP头中,用2个字节来描述报文的长度,2个字节所能表达的最大数字就是65535。所以,IP数据包的最大长度就是64K字节(65535)。
3、TCP(传输层)
TCP头部选项是一个可变长的信息,这部分最多包含40字节,因为TCP头部最长60字节,(其中还包含前面20字节的固定部分)。
依靠IP协议提供的报文分割和重组机制,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。
选项和填充,n4字节,常见的可选字段是最长报文大小 MSS(Maximum Segment Size) 。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是 32 位字的整数倍,所以要加填充位,使得报头长度成为整字数
MTU和MSS值的关系:MTU=MSS+IP Header+TCPHeader
通信双方最终的MSS值=较小MTU-IP Header-TCP Header
4、UDP(传输层)
UDP包的首部要占用8字节,因为UDP提供无连接服务,它的数据包包头,是固定长度的8字节,不存在可选字段,可以减少很多传输开销,所以它无需使用首部字段长,因为它的首部就是固定的。
UDP则与TCP不同,UDP包头内有总长度字段,同样为两个字节,因此UDP数据包的总长度被限制为65535,这样恰好可以放进一个IP包内,使得 UDP/IP协议栈的实现非常简单和高效。
所以UDP包的最大值是:IP数据包的最大长度65535-IP头的大小20-UDP头的大小=65507字节。最小值是0。
这个值也就是你在调用getsockopt()时指定SO_MAX_MSG_SIZE所得到返回值,任何使用SOCK_DGRAM属性的socket,一次send的 数据都不能超过这个值,否则必然得到一个错误。
————————————————
版权声明:转载
参考链接:
https://blog.csdn.net/buside/article/details/92802959?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328655.9369.16158574515802585&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
https://blog.csdn.net/ytx2014214081/article/details/80112277
https://www.cnblogs.com/caoguoping100/p/3658792.html
https://www.cnblogs.com/sinferwu/articles/7615276.html
原文链接:https://blog.csdn.net/qq_33344148/article/details/114929274?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166962502316800184133845%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166962502316800184133845&biz_id=0&utm_me
文章知识点与官方知识档案匹配
算法技能树首页概览
35079 人正在系统学习中
打开CSDN APP,看更多技术内容
C++ 解析pcap文件_c++ pcap_fulianzhou的博客
#ifndef _PCAP_PARSER_H_ #define _PCAP_PARSER_H_ #include <stdint.h>#pragma pack(1) //pacp文件头结构体 struct pcap_file_header { uint32_t magic/* 0xa1b2c3d4 */ uint16_t version_major/* magjor Versi...
继续访问
ProxySQL--灵活强大的MySQL代理层_kaifly的博客_proxysql
~]# dateservice iptables restarttcpdump -i em2 host 192.168.1.34 and port 3306 and host not 192.168.1.10 -w /tmp/sysbench-proxysql-network-issue.pacp 发现,sysbench“一直”在重传由于iptables新规则而无法返回的几个请...
继续访问
网络安全系列-二十五: PCAP文件格式详解及读取PCAP文件源码示例
在Linux里,pcap是一种通用的数据流格式,是用于保存捕获的网络数据的一种非常基本的格式。 很多开源的项目都使用这种数据格式,如wireshark、tcpdump、scapy、snort 本文针对pcap的文件格式进行详解,并提供读取pcap文件的源代码示例
继续访问
使用wireshark分析tcpdump出来的pcap文件
个人认为tcpdump+wireshark是很精确的,之前在网上查阅移动端流量测试,大多讲tcpdump这部分很精细,但是没有讲到详细使用wireshark分析tcpdump到的.pcap文件,这里做一个详细的讲解,仅供大家参考。 本人wireshark版本是V 2.2.1。tcpdump到的.pcap文件可以直接双击打开(默认打开方式为wireshark,或者你在wireshark中选择打开文件也可以),抓取到的数据包很多,我们需要过滤一些想要的数据,那么在如图所示的输入框中输入表达式过滤即可: Wire
继续访问
2020-2021项目遇到的部分问题 编程语言C++ 编程软件QT_Qingshan_z的博...
4.需要点击安装Win10Pacp文件夹中的对应内容。 更改编译器后,程序中文字符报错显示,包含换行符等字符显示错误 改两个地方: 改编码为UTF-8:编辑—Select Encoding—UTF-8—按编码保存 工具—选项—文本—行为—UTF-8—如果是UTF-8添加...
继续访问
BGP路由器协议排错教程:与平台相关的数据包捕获工具_AMZ学术的博客-CSDN...
注释 分析 EPC 捕获信息最简单的方式是把这些信息导出到远端服务器,并使用Wireshark 读取导出的.pacp 文件 2.5.3 Ethanalyzer Ethanalyzer 是 NX-OS 中的 TShark 实现。TShark 是终端版本的 Wireshark。它可以在所有 Nexus 平台上捕获带...
继续访问
linux 下 tcpdump 详解 前篇(libpcap库源码分析)
一 概述 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 至于tcpdump参数如何使用,这不是本章讨论的重点。 liunx系统抓包工具,毫无疑问就是tcpdump。而windows的抓包工具,wireshark也是一款主流的抓包工具。wireshark 使用了winpcap库。tcpdump...
继续访问
pcap抓包库部分函数说明
学习通过侦听网卡获取报文的程序,遇到部分pacp抓包库中的函数,在查阅资料后,作以下整理说明: 1. pcap_next_ex(): 基于非回调函数的捕获数据包,参数有三个,一个网卡描述符,两个指针,两个指针会被初始化并返回给用户,一个是pcap_pkthdr结构,一个是接收数据的缓冲区。pcap_pkthdr结构如下所示: struct pcap_pkthdr { struc
继续访问
网络安全、Web安全、渗透测试之笔经面经总结(二)_普通网友的博客-CSD...
在Unix/Linux平台上,可以直接使用Socket构造IP包,在IP头中填上虚假的IP地址,但需要root权限在Windows平台上,不能使用Winsock,需要使用Winpacp(也可以使用Libnet)。例如在Linux系统,首先打开一个Raw Socket(原始套接字),然后自己编写IP...
继续访问
Linux_liubo525的博客
文件-新建虚拟机-典型-稍后安装操作系统-Linux+版本-虚拟机名称-默认最大磁盘大小+存储为单个文件2)安装CentOS操作系统CD/DVD-使用ISO镜像文件-选择下载好了的ISO文件-打开虚拟机(开始安装虚拟机)...
继续访问
vlan 报文抓包.pcap
vlan报文,用于文档资源,学习vlan协议的时,可以下载看一下。
Pcap 数据包捕获格式详解
Pcap 是 Packet Capture 的英文缩写,是一种行业标准的网络数据包捕获格式。如果你是网络开发人员,那么通常会使用 Wireshark、Tcpdump 或 WinDump 等网络分析器捕获 TCP/IP 数据包,而抓包后存盘的文件格式就是 .pcap 文件。 文件格式 Pcap 文件格式是一种二进制格式,支持纳秒级精度的时间戳。虽然这种格式在不同的实现中有所不同,但是所有的 pcap 文件都具有如下图所示的一般结构。 全局报头 全局报头(Global Header)包含魔数(Magic nu
继续访问
渗透测试工程师面试题大全(164道)_Kal1的博客_渗透测试...
14.拿到一个 webshell 发现网站根目录下有.htaccess 文件,我们能做什么? 能做的事情很多,用隐藏网马来举例子: 插入<FilesMatch “xxx.jpg”>SetHandler application/x-httpd-php .jpg 文件会被解析成.php 文件 15.注入漏洞只能查账...
继续访问
dm 数据引流工具_hu5350026的博客_数据引流
log :该应用程序的日志记录文件存放的目录third :该应用程序依赖的第三方 jar 文件存放的目录wapper :该应用程序以服务方式启动包装文件的存放目录service_start.bat/sh :该应用程序以服务方式启动时的启动服务脚本文件...
继续访问
MISC:流量包取证(pcap文件修复、协议分析、数据提取)
鼠标协议:每一个数据包的数据区有四个字节,第一个字节代表按键,当取 0x00 时,代表没有按键、为 0x01 时,代表按左键,为 0x02 时,代表当前按键为右键。第二个字节可以看成是一个 signed byte 类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。HTTPs = HTTP + SSL / TLS. 服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。但是,如果采用主动模式,那么数据传输端口就是 20;
继续访问
c语言判断pcap文件结尾,PCAP文件扩展名 - 什么是.pcap以及如何打开? - ReviverSoft...
你在这里因为你有,有一个文件扩展名结尾的文件.pcap.文件与文件扩展名.pcap只能通过特定的应用程序推出。这有可能是.pcap文件是数据文件,而不是文件或媒体,这意味着他们并不是在所有观看。什么是一&nbsp.pcap&nbsp文件?该.pcap文件扩展名主要使用Wireshark相关用于分析网络的程序。 .pcap文件是使用程序创建的数据文件,并且它们包含的...
继续访问
UEBA架构设计之路1_lionzl的博客
Tcpdump,tcpflow生成的pacp或流数据,以及其他数据包级和session级信息 性能下降,超时,瓶颈或可疑活动,表明网络可能受到威胁或远程攻击 Syslog 路由、交换、其他网络设备 故障、分析、安全审计 WEB访问日志 WEB服务器 WEB分析 PROXY日...
继续访问
pcap文件解析--pcap文件头与包文件头(一)
初识Pcap文件 在开始读取pcap文件之前,先让我们来看看Pcap文件的大概结构。 如上图所示在一个Pcap文件中存在1个Pcap文件头和多个数据包,其中每个数据包都有自己的头和包内容。 下面我们先看看PCAP文件头每个字段是什么意思: magic为文件识别头,pcap固定为:0xA1B2C3D4。(4个字节) magor version为主版本号(2个
继续访问
pcap文件linux怎么打开,pcap文件用什么打开
linux 应用 pcap文件怎么打开如果你是一个测试入侵侦测系统或一些网络访问控制策略的网络管理员,那么你经常需要抓取数据包并在离线状态下分析这些文件。当需要保存捕获的数据包时,我们一般会存储为 libpcap 的数据包格式 pcap,这是一种被许多开源的嗅探工具以及捕包程序请问用什么软件打开*.pcap格式的文件?CSS布局HTML小编今天和大家分享解wireshark 怎么打不开pcap文件...
继续访问
Wireshark网络分析实战——Wireshark的安装和抓包
一、Wireshark简介 本节涵盖以下内容: 安置Wireshark(主机/程序); 开始抓包; 本书的前言曾提到过网络排障以及内置于Wireshark能帮助排障的各种工具。一旦决定动用Wireshark协议分析软件,在使用之前,则有必要先确定该软件在网络中的部署(或安装)位置。除此之外,还得对该软件做一些基本的配置,至少应让其界面看起来更为友好。 用Wireshark执行基本的抓包操作,配置起来并不麻烦,但是该软件也包含了很多高级配置选项,可用来应对某些特殊情况。这样的特殊情况包括令Wireshar
继续访问
学习笔记——C++实现ARP欺骗
以下代码大体上是没有问题的,可以根据自己的一些需求进行修改! 谢谢指正错误 在课设期间,从网上学习了简单的实现ARP欺骗 ARP欺骗的原理很简单:通过不断的向目标发送ARP包,致使目标主机的ARP缓存表中正确的IP映射的是错误的MAC地址 在书上的介绍中,采用了WinPcap的开发包,这样很方便的对网卡进行操作 所以,首先需要安装winpacp,并下载开发者包https://www......
继续访问
热门推荐 pcap文件格式及文件解析
第一部分:PCAP包文件格式 一 基本格式:文件头 数据包头数据报数据包头数据报...... 二、文件头:文件头结构体 sturct pcap_file_header { DWORD magic DWORD version_major DWORD ve
继续访问
最新发布 pcap详解
pcap格式及API详解
继续访问
从pcap文件提取包长度序列
从pcap文件提取包长度序列 1. 抓包 在windows系统,使用wireshark抓取YY语音流数据,最好是单条链路单向的。数据存储为pcap文件。 2. 格式转换 在linux系统终端,使用tcpdump命令把pcap文件转成txt文件。 命令为:tcpdump -r input.pcap >output.txt 3. 提取 在windows系统,使用matlab从转
继续访问
Ethernet Packet 解析
目录 引言 引言 接上篇文章 Pcap文件格式 ,我们分析了Pcap文件的global Header 和 Pcap Packet Header现在来分析一下Pcap Data。因为global Header 定义的 network 01 为 ETHERNET, 所以这篇文章来分析一下Pcap Data为Ethernet Packet类型的数据。 Ethernet Packet 结构 参考文档 Ethernet_frame--wikipedia IEEE_802.1.
继续访问
pcap包解析
pacp包解析 在接触激光雷达的时候,不可避免的第一步就是看硬件说明书以及调试厂商发的样例数据。一般情况下,厂商在存储硬件的数据包的时候,都是通过存储pacp包实现的,所以如何读取pacp包,并从中解析出真正有用的数据就变得很重要,接下来我们一步步讲。 1.pacp包结构 一个Pcap文件包括“Pcap报头”,“数据区”两个部分,其中数据区又分成多个数据包,每个包有报头和数据两个部分,总体结构可见...
继续访问
pcap文件内容保存为csv文件
将pcap文件内容导出为csv文件
继续访问
pacp文件读取缓存