wireshark抓包分析三次握手信息
基于上节搭好了服务器,利用浏览器访问web服务器,web服务器在8080端口监听,利用wireshark抓包,获取如下报文。
首先必须一提的是三次握手,基于tcp链接的数据报文传输前必须建立三次握手,我们分析一下前三个tcp报文
第一个报文:
这是第一个数据报文,它是由:tcp-->ip--->eth--->frame, 没有数据报文,说明第一个tcp不携带数据,同样其余两个也一样都是握手信号,只有握手成功,才能传递数据。
如何判别它是握手信息还是数据报文呢---->我们再进一步分析
我们注意到第一行 frame 201: 74bytes on write(592bits) ,74 bytes captured on interface 0
握手报文是有特点的:
物理头 = 14
ip头 = 20
tcp = 40
74 = 物理头 + ip头 + tcp
我们再分析一下,看他们有何作用
物理头
它指定src_mac 和 dst_mac 和ip层协议ipv4 = 0x0800(2bytes)--2个字节标识出以太网帧所携带的上层数据类型,注意mac一般为6bytes
IPv4: 0x0800
ARP:0x0806
PPPoE:0x8864
802.1Q tag: 0x8100
IPV6: 0x86DD
MPLS Label:0x8847
在不定长的数据字段后是4个字节的帧校验序列(Frame. Check Sequence,FCS)
再来看下ip头
它指明src_ip于dst_ip, version:4 ip_header_length = 20bytes
differentiated services field :0x00 ---区分服务,是为了客服inter--service的可扩展性差,这个在后期的qos,我会再次写到
标识(identification):该字段标记当前分片为第几个分片,在数据报重组时很有用
标志(flag):该字段用于标记该报文是否为分片(有一些可能不需要分片,或不希望分片),后面是否还有分片(是否是最后一个分片)。
片偏移:指当前分片在原数据报(分片前的数据报)中相对于用户数据字段的偏移量,即在原数据报中的相对位置。
生存时间:TTL(Time to Live)。该字段表明当前报文还能生存多久。每经过1ms或者一个网关,TTL的值自动减1,当生存时间为0时,报文将被认为目的主机不可到达而丢弃。使用过Ping命令的用户应该有印象,在windows中输入ping命令,在返回的结果中即有TTL的数值。
协议:该字段指出在上层(网络7层结构或TCP/IP的传输层)使用的协议,可能的协议有UDP、TCP、ICMP、IGMP、IGP等
首部校验和:用于检验IP报文头部在传播的过程中是否出错,主要校验报文头中是否有某一个或几个bit被污染或修改了。
源IP地址:32位(bit),4个字节,每一个字节为0~255之间的整数,及我们日常见到的IP地址格式。
目的IP地址:32位(bit),4个字节,每一个字节为0~255之间的整数,及我们日常见到的IP地址格式。
本质来说,用一个结构体来描述ip协议即可
再来看下tcp
tcp报文中指出了src_port和dst_port
tcp segmet len: 没有分片
seq = 0, ack = 0,是TCP可靠传输的关键部分
tcp_header_length = 40
数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
flags标志很有作用
congestion --拥塞
这个有几个标志位,置1则表示对应信号,清0表示
acknowledgment--应答应答
push --发送数据
rst --隔特定时间没有收到应答信号,再发送
syn --同步信号
fin --断开信号
urg --紧急指针
1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
窗口(window size value )0:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
校验和(checksum):奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
紧急指针(urgent pointer):只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项和填充(maxinum segment size):最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
以上就分析了三次握手中的第一次syn,其余两次类似
总结:我们进行http连接,由于http是基于tcp,所以必须进行三次握手,保证数据的可靠性
http是连接还是短连接要看数据报文
短连接: 客户端和服务端进行一次HTTP请求/响应之后,就关闭连接
长连接: 客户端和服务端建立一次连接之后,可以在这条连接上进行多次请求/响应操作。持久连接可以设置过期时间,也可以不设置。
connection: close ----短连接
connection: keep-active ---长连接 keep-alive:timeout = 60设置长连接的有效时间,比如在58又发起http连接,那么之前的三次握手连接还未失效,故节约时间,重新计数,空闲60秒之后过期
今天终于搞清楚长连接和短连接的关系了,很高兴,接下来就是http报文了