Blog

网络原理-计算机网络详解-各类包长度及抓包分析

大白话:局域网 mtu 1500;Internet  mtu 576

对于UDP协议来说,整个包的最大长度为65535,其中包头长度是20字节(包括了伪首部:这个伪首部其实是属于ip头部的部分,里面有源ip地址和目标ip地址)所以UDP实际可用携带的最大数据是:65515字节长度。【udp协议里面:长度占了2个字节,16位。能够表示的范围是2^16-1 即 0-65515】

去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小。
我们将遇到两个限制因素。第一,应用程序可能会受到其程序接口的限制。socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报(使用这个默认值是因为8192是NFS读写用户数据数的默认值)。
第二个限制来自于TCP/IP的内核实现。可能存在一些实现特性(或差错),使IP数据报长度小于65535字节。
在SunOS 4.1.3下使用环回接口的最大IP数据报长度是32767字节。比它大的值都会发生差错。
但是从BSD/386到SunOS 4.1.3的情况下,Sun所能接收到最大IP数据报长度为32786字节(即32758字节用户数据)。
在Solaris 2.2下使用环回接口,最大可收发IP数据报长度为65535字节。
从Solaris 2.2到AIX 3.2.2,发送的最大IP数据报长度可以是65535字节。很显然,这个限制与源端和目的端的实现有关。
主机必须能够接收最短为576字节的IP数据报。在许多UDP应用程序的设计中,其应用程序数据被限制成512字节或更小,因此比这个限制值小。

由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此,UDP编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?不幸的是,该问题的答案取决于编程接口和实现。
典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据。应用程序何时能够知道,则与版本有关(4.3BSD Reno及其后的版本可以通知应用程序数据报被截断)。
SVR4 下的socket API(包括Solaris 2.x) 并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UDP数据报中多次进行读取操作。TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。在讨论TCP时,我们发现它为应用程序提供连续的字节流,而没有任何信息边界。TCP以应用程序读操作时所要求的长度来传送数据,因此,在这个接口下,不会发生数据丢失。

对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传 输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值 ,确定为这次连接的最大MSS值。

IP层:
对于IP协议来说,IP包的大小由MTU决定(IP数据包长度就是MTU-28(包头长度)。 MTU值越大,封包就越大,理论上可增加传送速率,但 MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。

UDP 包的大小就应该是 1500 – IP头(20) – UDP头(8) = 1472(BYTES)
TCP 包的大小就应该是 1500 – IP头(20) – TCP头(20) = 1460 (BYTES)

当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于 MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报。
因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好.
进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作.

一般默认的设置,PPPoE连接的最高MTU值是1492, 而以太网 (Ethernet)的最高MTU值则是1500,而在Internet上,默认的MTU大小是576字节。

鉴于 Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.最好将UDP的数据长度控件在548字节 (576-8-20)以内.


许多服务器将最大的UDP数据包限制为512字节(如dns)

IPv4 最小重组缓冲区大小是576,IPv6在1500处。从这里减去标头大小。请参阅W. Richard Stevens的UNIX网络编程

576字节是最小的缓冲区大小,即每个实现必须能够重组至少那个大小的分组。有关详细信息,请参阅IETF RFC 1122

安全UDP的有效载荷最大是508字节。这是一个数据包大小为576,减去最多60个字节的IP标头和8个字节的UDP标头。任何这个规模或更小的UDP有效载荷都保证可以通过IP交付(尽管不能保证完整的交付)。由于其他原因,在路由的过程中可能会丢失。除了仅IPv6路由,最大有效载荷为1,212字节。正如其他人所提到的,在某些情况下可以添加额外的协议头。取而代之的是300-400字节的存储空间。

任何UDP数据包都可能被分割。这并不重要,因为丢失一个数据包与丢失一个未分组的数据包具有相同的效果:使用UDP,整个分组被丢弃的这种种情况是可能发生的。

一个典型 IPv4报头为20个字节,和UDP头部为8个字节。但是又包含IP选项,这可以将IP报头的大小增加到60个字节。另外,有时中间节点需要将数据报封装在另一个协议中,如IPsec(用于VPN等),以便将数据包路由到目的地。因此,如果你不知道MTU特定网络路径的话,最好为其他标题信息留下合理的存储空间,可能这些信息并不是你预期的。通常认为UDP的有效载荷是512字节,即使这样处理也不能为最大尺寸的IP标头留下足够的存储空间。


抓包实测 – UDP/TCP数据包分析

经测试,局域网环境下,UDP包大小为1024*8,速度达到2M/s,丢包情况理想.
外网环境下,UDP包大小为548,速度理想,丢包情况理想.

本文旨在分析使用抓包工具抓取到的数据包。

(一)抓包工具

tcpdump:linux下的抓包利器

wireshark:带GUI的抓包工具,其前身是大名鼎鼎的Ethereal

(二)抓包

这里只简述tcpdump的一般用法,详细资料可参考tcpdump使用手册。

wireshark带有GUI,操作比较简单,暂不赘述。

tcpdump -i eth1 tcp -Xnlps0 port 16815 src host 192.168.0.0 and dst net 192.168.0.1
tcpdump -i eth1 -Xnlps0 dst net 172.23.9.155 and port 37861
tcpdump -i eth1 -Xnlps0 dst net 172.23.9.155 and port 37861 -w yourfile

PS:可以使用wireshark分析tcpdump抓取的数据包

tcpdump -w output.cap -s0

wireshark可以在图形界面下分析应用层按照TCP/IP四层结构显显示数据包,
第一行是数据链路层的信息,
第二行是网络层信息(IP协议),
第三行是传输层信息(TCP协议),
第四行是应用层信息(HTTP协议),
可以展开每一行用来观察具体的内容

(三)TCP/UDP数据包结构

抓包分析,装载udp的ip包和装载tcp的ip包,查明ip包首部都没有添加可选项。

PS:后面的数据分析都是带IP头的数据包。

(四)UDP数据包分析

0x0000:  4500 0054 9a08 4000 4011 b88d ac17 8639  E..T..@.@……9
0x0010:  ac17 099b e317 93e5 0040 e854 0000 0065  ………@.T…e
0x0020:  012d d668 0000 0000 0000 0000 0000 0038  .-.h………..8
0x0030:  3030 3030 3030 3030 3030 3030 3030 3030  0000000000000000
0x0040:  0000 0001 0000 0000 0000 0000 0000 0000  …………….
0x0050:  0000 0000

4500        [4: ipv4], [5: header length, *4 ==> 20], [00: Type of Service(TOS)]
0054        [total length: 0x54(84), ip header(20) + udp header(8) + packlen(56) -> 84]
9a08        id
4000        3bits(ip flags), 40 -> do not flag, 5bits: fragment offset
4011        [ttl: 40], [protocol: 0x11(17) ==> udp]
b88d        checksum
ac17 8639   source ip: 172.23.134.57

ac17 099b   dest ip: 172.23.9.155
e317        sourc port: 58135 (ntohs(0xe317)) [exchange]
93e5        dest port: 37861
0040        length: 64
e854        checksum

0000 0065…  data

 

(五)TCP数据包分析

0x0000:  4500 0073 cdc5 4000 4006 6285 ca6e 4099  E..s..@[email protected]@.
0x0010:  7474 8abe 1f40 070a 6d88 acdd 23d7 a448  tt…@..m…#..H
0x0020:  5018 16d0 0aa0 0000 0100 8000 0000 0047  P…………..G
0x0030:  3004 8000 0016 8117 04d7 cd00 000b 0006  0……………
0x0040:  4500 1a4d 6bd0 180a 909a bc08 883d edea  E..Mk……..=..
0x0050:  091f                                     ..

4500        [4: ipv4] [5: ip header length, 4*5 -> 20] [00 TOS]
0073        [total length: 0x73(115), ip header(20) + tcp header(20) + packlen(75) -> 115]
cdc5        id(ignore it)
4000        3bits(ip flags), 40 -> do not flag, 5bits: fragment offset
4006        [40 ttl] [06 protocol, 0x06 -> tcp]
6285        checksum
ca6e 4099   source ip: 202.110.64.153

7474 8abe   dest ip: 116.116.138.190
1f40        sourc port: 8000 (ntohs(0x401f)) [exchange]
070a        dest port: 1802
6d88 acdd   32 bits sequence number(ignore)
23d7 a448   32 bits ack(ignore)

5018        [5: tcp header length 5 * 4 -> 20] [018: 0000 00/01 1000: reserved 6bit -> ACK+PUSH] (URG|ACK|PSH|RST|SYN|FIN)
16d0        16bit window size: 5840
0aa0        16bit tcp checksum(ignore)
0000        16bit urgent pointer
———————

抓包工具:科来网络分析系统

https://blog.csdn.net/cybertan/article/details/5961049

参考:

https://blog.csdn.net/wirror800/article/details/6977421

https://blog.csdn.net/buptzwp/article/details/5055487

网络原理-计算机网络详解-网线传递数字信号的原理

家用的网线:传递的数字信号,原理是:

(1)和电线传输电的原理一样,只不过网线上传输的就是脉冲电信号,而且遵守一定的电器规则。
(2)计算机上的数据都是用0和1来保存的,所以在网线上传输时就要用一个电压表示数据0,用另一个电压表示数据1。
(3)网线上传输的是数字信号。
(4)网线在传输数据就是传输电信号,就会有电流通过,那么就会产生电磁场,几根线之间的电磁场就会互相干扰,会影响电压,使得数据失真,所以把绞在一起就可以有效的抵消掉这种线之间的互相电磁干扰。

总结来说:网线就是传递的脉冲电信号,在一个脉冲中,即有电压变化,又有电流变化。
网线传输信号是数字信号,方波,相当脆弱,容易受到周边磁场和自身的干挠。所以双绞的原理就是为了尽可能的消除其干挠。
我们日常使用最多的网线就是双绞线,但网线不能过长,电脑能识别的语言就只有0和1,网络得传输信号就是0和1。这些信号通过网线的时候变成了电流,而网线的电流强度是-15v和+15v之间,电流通过网线传输的时候会有电阻。所以,根据高压输电原理,线路越长,就要用越大的电压等级来输电。如果网线过长,但是这么低的电压,就会导致信号减弱,直至丢失。因此网线不宜过长,一般来说,网线超过一百米,另一头就接收不到信号了。

rj45网线中,单方向传输信号都是一对导线,里面用的是差分信号,传递给对方的是电压变化 信号。【双绞线 可以 屏蔽 外界的 电磁干扰,抗干扰强】

如果差分信号电路中的源和接收器阻抗相等,则外部电磁干扰往往会同样影响两个导体。由于接收电路仅检测导线之间的差异,因此与具有未配对参考(接地)的一个导体相比,该技术抵抗电磁噪声。该技术适用于模拟信号,如平衡音频和数字信号,如RS-422,RS-485,双绞线以太网,PCI Express,DisplayPort,HDMI和USB。【来自维基百科】

数字电路:从 单端信号 发展到 差分信号

单端信号与同轴电缆一起使用,其中一根导线完全屏蔽另一根导线与环境。所有屏幕(或屏蔽)都组合成一块材料,形成一个共同的地面。差分信号与平衡的导体对一起使用。对于短电缆和低频,这两种方法是等效的,因此具有公共接地的廉价单端电路可以与廉价电缆一起使用。

单端信号
早期的数字总线大部分使用单端信号做信号传输,如TTL/CMOS信号都是单端信号。所谓单端信号,是指用一根信号线的高低电平的变化来进行0、1信息的传输,这个电平的高低变化是相对于其公共的参考地平面的。单端信号由于结构简单,可以用简单的晶体管电路实现,而且集成度高、功耗低,因此在数字电路中得到最广泛的应用。

大白话:单端信号 用一根线 接地,另一根 传递 电压 高低变化,当然也是 单方向 传输啦。

======================================================

差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反。在这两根线上的传输的信号就是差分信号。信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。

差分信号是用一个数值来表示两个物理量之间的差异。差分信号又称差模信号,是相对共模信号而言的。


网线传输原理

一般情况下,网络从上至下分为五层:应用层、传输层、网络层、数据链路层、物理层。每一层都有各自需要遵守的规则,称之为“协议”。TCP/IP协议就是一组最常用的网络协议。
网线在网络中属于物理层,计算机中所需要传输的数据根据这些协议被分解成一个一个数据包(其中包括本地机和目的机的地址)后,按照一定的原则最后通过网线传输给目的机。通俗讲,和我们去寄信的道理一样,先写好信的内容(计算机上的数据)、装信封然后在封面上写地址(打包成数据包,里面包含本地机和目的机的地址)、寄出(传输),那么网线就相当于你的地址和你要寄到的地址之间的路。
(1)如上所述,和电线传输电的原理一样,只不过网线上传输的就是脉冲电信号,而且遵守一定的电气规则。
(2)计算机上的数据都是用0和1来保存的,所以在网线上传输时就要用一个电压表示数据0,用另一个电压表示数据1。
(3)网线上传输的是数字信号
(4)网线在传输数据就是传输电信号,就会有电流通过,那么就会产生电磁场,几根线之间的电磁场就会互相干扰,会影响电压,使得数据失真,所以把绞在一起就可以有效的抵消掉这种线之间的互相电磁干扰。
网线传输信号是数字信号,方波,相当脆弱,容易受到周边磁场和自身的干挠。所以双绞的原理就是为了尽可能的消除其干挠。
明白了网线所接的水晶头:rj45接口原理就自然明白了网线的原理:
RJ-45各脚功能(10BaseT/100BaseTX):
1、传输数据正极   Tx+
2、传输数据负极   Tx-
3、接收数据正极   Rx+
4、备用(当1236出现故障时,自动切入使用状态)
5、备用(当1236出现故障时,自动切入使用状态)
6、接收数据负极   Rx-
7、备用(当1236出现故障时,自动切入使用状态)
8、备用(当1236出现故障时,自动切入使用状态)
网线中传输的是数字信号,网卡工作在物理层,是将数据根据OSI的七层协议,从要传输的数据一级一级的转换成帧数据,用电信号的方式传输出去,接收方依同样的原理,转换成对方的原始数据。
RJ-45的接头实现了网卡和网线的连接。它里面有8个铜片可以和网线中的4对双绞(8根)线对应连接。其中100M的网络中1、2是传送数据的,3、6是接收数据的。1、2之间是一对差分信号,也就是说它们的波形一样,但是相位相差180度,同一时刻的电压幅度互为正负。这样的信号可以传递的更远,抗干扰能力强。同样的,3、6也一样是差分信号。
网线中的8根线,每两根扭在一起成为一对。我们制作网线的时候,一定要注意要让1、2在其中的一对,3、6在一对。否则长距离情况下使用这根网线的时候会导致无法连接或连接很不稳定。
首先说一下差分方式传输。所谓差分方式传输,就是发送端在两条信号线上传输幅值相等相位相反的电信号,接收端对接受的两条线信号作减法运算,这样获得幅值翻倍的信号。其抗干扰的原理是:假如两条信号线都受到了同样(同相、等幅)的干扰信号,由于接受端对接受的两条线的信号作减法运算,因此干扰信号被 基本抵消,那么怎样才能保证两条信号线受到的干扰信号尽量是同相、等幅的呢?办法之一那就要将两根线扭在一起,按照电磁学的原理分析出:可以近似地认为两条信号线受到的干扰信号是同相、等幅的。 两条线交在一起后,既会抵抗外界的干扰也会防止自己去干扰别人。一般常用的就是双绞线。
大多数局域网使用非屏蔽双绞线(UTP—Unshielded Twisted Pair)作为布线的传输介质来组网,网线由一定距离长的双绞线与RJ45头组成。双绞线由8根不同颜色的线分成4对绞合在一起,成队扭绞的作用是尽可能减少电磁辐射与外部电磁干扰的影响,双绞线可按其是否外加金属网丝套的屏蔽层而区分为屏蔽双绞线(STP)和非屏蔽双绞线(UTP)。在EIA/TIA-568A标准中,将双绞线按电气特性区分有:三类、四类、五类线。网络中最常用的是三类线和五类线,超五类,目前已有六类以上线。第三类双绞线在LAN中常用作为10Mbps以太网的数据与话音传输,符合IEEE802.3 10Base-T的标准。第五类双绞线目前占有最大的LAN市场,最高速率可达100Mbps,符合IEEE802.3 100Base-T的标准。做好的网线要将RJ45水晶头接入网卡或HUB等网络设备的RJ45插座内。相应地RJ45插头座也区分为三类或五类电气特性。RJ45水晶头由金属片和塑料构成,特别需要注意的是引脚序号,当金属片面对我们的时候从左至右引脚序号是1-8, 这序号做网络联线时非常重要,不能搞错。双绞线的最大传输距离为100米。 EIA/TIA的布线标准中规定了两种双绞线的线序568B与568A。
标准568B:橙白–1,橙–2,绿白–3,蓝–4,蓝白–5,绿–6,棕白–7,棕–8
标准568A:绿白–1,绿–2,橙白–3,蓝–4,蓝白–5,橙–6,棕白–7,棕–8
568A和568B两者有何区别呢?后者是前者的升级和完善,但是后者还处于草案阶段,包含永久链路的定义和六类标准。另外在综合布线的施工中,有着568A和568B两种不同的打线方式,两种方式对性能没有影响,但是必须强调的是在一个工程中只能使用一种打线方式。
至于5类和超5类的不同主要是应用的不同。5类系统在使用过程中只是使用其中的两对线缆,采用的是半双工,而超5类为了满足千兆以太网的应用,采用四对全双工传输。因而远端串扰(FEXT),回波损耗(RL)、综合近端串扰(PSNEXT)、综合ACR和传输延迟也成为必须考虑的参数。所以超5类比5类有着更高的性能要求。6类和5类实质的区别在于它们的带宽不同,5类只有100MHz,六类是250MHz。它们支持的应用也因为性能的不同而不同,6类支持更高级别的应用。在性能上6类也比5类有更高的要求,为了提高性能,在结构上6类比5类也要复杂一些RJ45接头的8个接脚的识别方法是,铜接点朝自己,头朝右,从上往下数,分别是1、2、3、4、5、6、7、8。
在整个网络布线中应用一种布线方式,但两端都有RJ-45 的网络联线无论是采用568A,还是568B, 在网络中都是通用的。规定双工方式下本地的1、2两脚为信号发送端,3、6两脚为信号接收端,所以讲,这两对信号必须分别使用一对双绞线进行信号传输。在做线时要特别注意。现在100M网一般使用568B方式,1、2两脚使用橙色的那对线,其中白橙线接1脚;3、6两脚使用绿色的那对线,其中白绿线接3脚,绿线接6脚,剩下的两对线在10M、100M快速以太网中一般不用,通常将两个接头的4、5和7、8两接头分别使用 一对双绞线直连,4、5用蓝色的那对线,4为蓝色,5为白蓝色;7、8用棕色的那对线,7为白棕色、8为棕色。如果网线两头都按一种方式这么做的话就叫做直连缆方式或直通线方式。
如果网线的两头不按一种方式,一头是568B,另一头是568A,那么这种做法叫交*缆,其实就是只须将其中一个 头在568B的基础上1、2和3、6对调一下就行。不同的做法用在不同的环境,后面会讨论。
很多人以为做直连缆时将线排成,这是错误的。这既不是568A也不是568B。这种做法3、6信号线未绞在一起,失去了双绞线的屏蔽作用。虽然在传输距离近时能正常使用不容易被发现,当传输距离远时会出现丢包,或者导致局域网速度慢,很多人会怀疑网卡质量和网线质量,往往不会想到是线做的有问题。
当网线作为局域网线路时,电压不超过3伏
作为电话线路时,电话在待机状态(即没拿起来时)供电电压为-48V(反向电位) 当电话被打通需要震铃时,供电电压为+48V(正向电位)并且叠加24V 25HZ交流,使其成为72V交流25HZ震荡信号。这样就会震铃了。 当拿起电话后(无论是对方打来还是你自己拿起)电压从-48V下降并转换为+8—+18V(这个由你线路距离局端设备远近而不同) 电话是以恒流方式供电。也就是,电流一定,功率越大,电压越高。并且除了震铃之外,其他的全部为直流送电,包括脉冲直流 并且,如果是之后新装的线路中,大多地区已经使用数字模拟混合接入,即若你的电话为06年之后购买并符合标准的,则为数字信号,用载波模式装载到线路中传输,若为之前的或者局端设备还没有更新,那么则是模拟信号,用电流高低震荡的方式传送。
作为电口出来的网线时,网线供电器的输出电压一般是24V或者48V,INTEL的设备就是24V,CISCO和神脑的设备就是48V,这样经过100米的网线传输后,电压还是足够的,而这些网络设备内部还有一个转换电路,将这些可能高于要求的电压降到正常范围内。
数字信号从Internet上下载下来,通过ISP接入你所在区域的交换机,通过D/A变换变成模拟信号,经过4线至2线的变换后,传到你的调制解调器,再经过一次A/D变换,还原成计算机可接受的数字信号。


无线网快还是插网线快?

同一个路由器下,绝大多数情况下,网线比无线网快。

不敢说绝了,因为上网情况不太,实际上网速度也有略有影响。

正常来说,插网线的网络损耗比较少,在局域网中常见的网线主要有双绞线、同轴电缆、光缆三种。 双绞线,是由许多对线组成的数据传输线。它的特点就是价格便宜,所以被广泛应用,如我们常见的电话线等。它是用来和RJ45水晶头相连的。

我们日常使用最多的网线就是双绞线,但网线不能过长,电脑能识别的语言就只有0和1,网络得传输信号就是0和1。这些信号通过网线的时候变成了电流,而网线的电流强度是-15v和+15v之间,电流通过网线传输的时候会有电阻。所以,根据高压输电原理,线路越长,就要用越大的电压等级来输电。如果网线过长,但是这么低的电压,就会导致信号减弱,直至丢失。因此网线不宜过长,一般来说,网线超过一百米,另一头就接收不到信号了。

而我们正常使用网线的一般只有几米,损耗是非常少的。

无线网络损耗比较大的原因比较多,如建筑物对网络的损耗,特别是建筑物中的承重墙对网络损耗会比较大。由于wifi信号有特定的信道,这些信道就如同告诉公路,如果附件多个路由器发射出来的wifi都在一个信道传输,也会导致网络变慢。

在家中使用PC用网线连接路由器比wifi连接网速还是要更好的。

其实路由器端是没有太大问题的,虽然标称300m的2.4gWIFI有大半虚标,但实际值还是比有线的100m快的。但是问题就在于你的笔记本电脑,手机和便宜的无线网卡速率都是54m!

这就产生瓶颈制约,路由器标称给你6碗饭,实际给你3碗饭,但你只吃得下1碗!

现在的电脑配置也有问题,机械硬盘标称和测速都显示130m/s以上,但实际上使用起来持续速度只有40m/s左右,因为机械盘早期写入的是缓存,缓存再写入碟片,但测速软件测的是写入缓存的速度而非写入盘片的速度。测速450m/s的ssd真实持续写入速度其实也就95m/s。

40m/s换算为速率就是480mbps,所以,你的电脑根本上来说就只能用480m的网速,什么千兆网卡都是噱头,因为根本没这能力跑!ssd会好一些,但是也只能勉强跑满千兆!

千兆有线的设备成本比较低,而你如果想用千兆WIFI,光路由器和接收器的投资就不低于2500元,而且还要专用,不能通用。

总之,这是这个时代的科技局限,你手机无线接收模块就只54mbps,速度上限就7m/s,5g的会好点,但也只能到15m/s左右的上限。你用再好的路由器都没用!

包括现在的小米用了黑科技双WIFI,但也只能增加WIFI信号强度而不能增加速度。

总结:现在普遍使用百兆有线的情况下,有线是要比无线快的,想要无线比有线快,要等高标准的WIFI接收模块普及了才行。

首先有两个概念。

我们常说的网速:“XX兆光纤”,对应到一个专业词汇叫“网络带宽”。指的是单位时间的传输效率,一般运营商给的这个值是理论最大值。实际情况往往到不了这个大小。一个比较好的类比是,带宽越大,就好像一个高速公路修得越宽,车道越多。
第二个生活化的词汇是“网好卡”,对应到专业词汇叫“网络延迟”,延迟有很多部分组成,也受很多因素影响。但最终用户感受到的是一个网络请求从开始到收到结果的时间间隔。可以类比为高速公路上的车跑的快慢。
所以上面我们可以看出,网络“卡不卡”是有两个指标衡量的,在不同的使用场景下时有不同的判断依据的。

下面举例两个场景。

用手机或者电脑打游戏的时候,往往游戏需要发生的网络请求很频繁但是数据量并不大。这个时候我们需要网络延迟很低,但是并不需要有很大的网络带宽。所以我们经常能看到,隔壁老王家10兆的网络比你家100兆的网络打游戏更加顺畅。类比到高速公路上,就是相当于有很多赛车一辆接一辆在两个地方往返,这个时候路面是不是很宽其实大家不太在乎,在乎的是“路好不好走”,也就是延迟是不是很低。
在线观看视频或者下载资料的时候,电脑会从网络上不断的下载信息,放到本地,供我们观看。这些信息相对是非常大的,这时候我们就需要很宽的公路去运送这些资源到本地来,路面稍微难走一点也没有关系。这个场景下我们需求的是大的带宽,对延时没有太高的要求。
说完了啥叫网络卡,以及不同场景下的不同需求,我们来看一看有线连接和无线连接的区别。(这只讨论家用路由器和日常使用设备之间的连接形式)。

顾名思义有线连接就是信息由路由器到主机之间用光缆连接以传输信息,信息传输过程是先将电信号转化为光信号在光缆中传输,然后另一端接收到结果后再由光信号转换为电信号。完成传输。在光缆内传输的好处是,受到外界干扰很小,而且本身带宽也足够大(现在市面上光缆的传输带宽都是远大于我们家用网络带宽的)。
而无线连接则是,路由器和主机之间,将电信号通过调制解调器转换,以电磁波为载体在端与端之间传输。优势在于方便。但是劣势也很明显,例如电磁波比较容易受到干扰,传输带宽和发射功率有关,以及多个无线网信道之间相互干扰等等
所以从理论上看,相应其他条件下,有线连接会比无线连接在网络带宽和网络延时上都更具有优势一些。

至于其他答案中提到的2.4G和5G标准相关的内容,其实都是这个标准下用了全新不易冲突的电磁波频段以及新的硬件标准使得相同功率下传输效率更高。但是现阶段而言,不太可能突破有线连接的速度。

再顺便提及一下某些朋友可能的疑虑,电脑接有线,手机用无线,体验上手机比电脑更加流畅。这个问题其实很简单,做对比要控制好变量,很可能体验上的差别是由其他东西导致的。比如运营商在晚高峰的时候承诺的带宽达不到,或者晚高峰网络拥塞整体延时都增加了等等。

你们见过数据中心用无线传业务数据吗?!

1.无线工作方式为半双工,类似于以前那种很老的hub(冲突检测,载波侦听,就是我在用的时候你就得等着我把数据传完你再传)。

2.无线的吞吐看起来参数比千兆有线还高(1200Mbps甚至5300Mbps),但他的工作方式决定了它在多用户的环境下性能损失非常大,特别是多用户大吞吐的时候,抖动增大和速率下降都会非常利害,信号也容易受到干扰还不安全。

3.现在高端一点的无线路由器在硬件层面有mimo数据流的多入多出,链路聚合,专用无线处理芯片等技术,但其实性能提升也有限,原因还是看第一点他的工作原理决定的。软件层面会有一些专业的商业公司出的专用操作系统比如aruba,Cisco,huawei等,但也只是在稳定性,安全性和部署维护上进行了优化。

4.有线的路由器或者交换机会有专门的处理芯片来处理三层的路由数据和二层的交换数据,一般都能达到线速转发。比如48口的交换机背板宽带宽228Gbps,实际上只要用到96Gbps就足够让这48台终端同时上下行并发吞吐数据了,而且延时抖动和速率下降并不明显,如果是无线分分钟死给你看。但是呢即使是dlink tplink fast 腾达之流,瞎标参数,千兆有线也比大牌的千兆无线快和稳定,但不用说那种专业厂商的设备。

个人经验,高端点的ac无线路由器单纯的作为接入点30人左右的接入会有比较好的用户体验,尽管他可能支持128或者更高的接入,但能连接和可以用可是二码事。一分钱一分货,那种几十块的就不用说了,家庭3到5个人,要求不高,也能用。

所以,至少一段时间来看无线都只是作为接入层的扩展设备而存在,因为他不用布线方便啊

参考链接:

https://www.bilibili.com/read/cv1166002/

https://www.diangon.com/thread-17307-1-1.html

java安装配置-centos平台

在centos下,默认装的是openjdk的 jre版本。

可以使用java 但不能使用 javac

[root@superguy ~]# rpm -qa | grep jdk 
java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64
java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.4.el7_5.x86_64
copy-jdk-configs-3.3-10.el7_5.noarch
java-1.7.0-openjdk-1.7.0.191-2.6.15.4.el7_5.x86_64
java-1.8.0-openjdk-headless-1.8.0.181-3.b13.el7_5.x86_64
[root@superguy ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@superguy ~]# javac
bash: javac: command not found...
Similar command is: 'java'
[root@superguy ~]# java
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
where options include:
    -d32	  use a 32-bit data model if available
    -d64	  use a 64-bit data model if available
    -server	  to select the "server" VM
                  The default VM is server.

    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -D<name>=<value>
                  set a system property
    -verbose:[class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  require the specified version to run
    -showversion  print product version and continue
    -jre-restrict-search | -no-jre-restrict-search
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  include/exclude user private JREs in the version search
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                  see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.
[root@superguy ~]#

后来查询发现需要装 openjdk 的devel 版本

[root@superguy ~]# yum list |grep jdk
copy-jdk-configs.noarch                  3.3-10.el7_5                   @updates
java-1.7.0-openjdk.x86_64                1:1.7.0.191-2.6.15.4.el7_5     @updates
java-1.7.0-openjdk-headless.x86_64       1:1.7.0.191-2.6.15.4.el7_5     @updates
java-1.8.0-openjdk.x86_64                1:1.8.0.191.b12-0.el7_5        @updates
java-1.8.0-openjdk-headless.x86_64       1:1.8.0.191.b12-0.el7_5        @updates
java-1.6.0-openjdk.x86_64                1:1.6.0.41-1.13.13.1.el7_3     base    
java-1.6.0-openjdk-demo.x86_64           1:1.6.0.41-1.13.13.1.el7_3     base    
java-1.6.0-openjdk-devel.x86_64          1:1.6.0.41-1.13.13.1.el7_3     base    
java-1.6.0-openjdk-javadoc.x86_64        1:1.6.0.41-1.13.13.1.el7_3     base    
java-1.6.0-openjdk-src.x86_64            1:1.6.0.41-1.13.13.1.el7_3     base    
java-1.7.0-openjdk-accessibility.x86_64  1:1.7.0.191-2.6.15.4.el7_5     updates 
java-1.7.0-openjdk-demo.x86_64           1:1.7.0.191-2.6.15.4.el7_5     updates 
java-1.7.0-openjdk-devel.x86_64          1:1.7.0.191-2.6.15.4.el7_5     updates 
java-1.7.0-openjdk-javadoc.noarch        1:1.7.0.191-2.6.15.4.el7_5     updates 
java-1.7.0-openjdk-src.x86_64            1:1.7.0.191-2.6.15.4.el7_5     updates 
java-1.8.0-openjdk.i686                  1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-accessibility.i686    1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-accessibility.x86_64  1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-accessibility-debug.i686
java-1.8.0-openjdk-accessibility-debug.x86_64
java-1.8.0-openjdk-debug.i686            1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-debug.x86_64          1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-demo.i686             1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-demo.x86_64           1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-demo-debug.i686       1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-demo-debug.x86_64     1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-devel.i686            1:1.8.0.191.b12-0.el7_5        updates 
java-1.8.0-openjdk-devel.x86_64          1:1.8.0.191.b12-0.el7_5        updates

先更新 openjdk的jre版本,然后下载最新的 openjdk的devel版本。这个版本可以运行 javac

yum install java-1.8.0-openjdk-devel


参考国外教程

一、Installing Java

Before installing Tomcat we will have to install Java Development Kit (JDK) on our system but it is recommended that you update the system and available packages before installing JDK. Run the following command to update system.

yum -y update

Now once the system is updated install JDK and to do so run following command:

yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64

The above command will take some time to install JDK so you should wait until the installation process has finished.

When Java is installed check the java version with the following command:

java -version

You’ll see a result similar to this :

[root@ip-172-31-16-36 ~]# java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b15)
OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)
[root@ip-172-31-16-36 ~]#

二、Java Home Environment

Before you configure Java Home Environment we recommend you to check where the Java directory is and to do so run following command:

sudo update-alternatives --config java

Now edit the environment file with any text editor here we are using nano editor but you can choose anyone you wish.

nano /etc/environment

Now add the Java Home Environment variable as shown below :

JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-1.b15.el7_2.x86_64/jre"

You can simply copy/paste this to your file.

After adding Java Home Environment save and exit from the editor.

Now we’ll have to edit the .bash_profile so run the command given below:

nano ~/.bash_profile

Now add the Home Environment variable as shown below:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-1.b15.el7_2.x86_64/jre export PATH=$JAVA_HOME/bin:$PATH

Save file and exit from the editor.

We recommend you reload the .bash_profile, to do so run following command:

source ~/.bash_profile

We recommend you make sure there is no error in configuring Home Environment variable and also check the Java Home environment variable :

echo $JAVA_HOME

You will see output similar to this containing the path to java directory :

[root@ip-172-31-16-36 ~]# nano ~/.bash_profile
[root@ip-172-31-16-36 ~]# source ~/.bash_profile
[root@ip-172-31-16-36 ~]# echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-1.b15.el7_2.x86_64/jre
[root@ip-172-31-16-36 ~]#

 

docker入门概述-(2)-能干嘛

一、之前的虚拟机技术

虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。


虚拟机的缺点:
1    资源占用多                2    冗余步骤多                  3    启动慢

二、容器虚拟化技术

由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统 ,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
比较了 Docker 和传统虚拟化方式的不同之处:
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
*而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核, 而且也没有进行硬件虚拟 。因此容器要比传统虚拟机更为轻便。
* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

三、Docker虚拟化优势

图 1.4.1.1 – 传统虚拟化
图 1.4.1.2 – Docker

对比传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

1、更高效的利用系统资源【比虚拟机】

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

2、更快速的启动时间【比虚拟机】

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

3、更轻松的维护和扩展【比虚拟机】

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

4、一致的运行环境【同虚拟机】

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

5、持续交付和部署【同虚拟机】

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

6、更轻松的迁移【同虚拟机】

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

四、docker应用举例

携程 docker 使用情况:

https://www.v2ex.com/t/404193

今天心情还可以,就放点干货节约点你搜索的时间。

.Net 大户的选择:Windows Container 在携程的应用
https://www.v2ex.com/t/335653

Virtualization Documentation
https://docs.microsoft.com/zh-cn/virtualization/#pivot=main&panel=containers

https://yq.aliyun.com/articles/62375

docker入门概述-(1)-是什么

惨痛教训:

docker的镜像相当于是一个部署环境,主要用于生产环境,不适合开发环境,因为第一次在镜像上安装完软件后,第二次打开镜像发现,自己安装的软件都不在了。所以每次自己装完软件后,都需要打包成新的镜像。

一、docker简史

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)

Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroupnamespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

二、docker出现原因

一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题, 软件可以带环境安装? 也就是说, 安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。


之前在服务器配置一个应用的运行环境,要安装各种软件,就拿尚硅谷电商项目的环境来说吧,Java/Tomcat/MySQL/JDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 Windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。

传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式, 开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况 。Docker镜像的设计, 使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

三、docker介绍

Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到 “一次封装,到处运行”


Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。 只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

总结:
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

四、docker大白话总结

1、Docker 不是虚拟机,和宿主共享内核的,所以 Linux 内核下的 Docker 只能装linux 的 Container。
2、Windows container 目前支持的系统是 Windows server 2016 ,这个版本是去年 10 月份正式发布的(携程是国内比较早的一批拿到了他们的 RTM 版本),支持两类 server ,一类是 server core ,另一类是 nano server 。 nano server 是微软比较推荐的一类服务器系统,启动非常快,可以大幅度缩短计划内维护宕机时间,通常几秒钟就起来了,不包含硬件检测的时间,几十秒都能够起来。
简单来说:
linux下面的docker只支持linux 容器,Windows下面的类docker只支持Windows容器。
因为linux 容器可以 通过 XWindows 协议 进行图像 传递,所以  linux容器 可以 运行GUI软件。

Does Docker for Windows Server 2016 support GUI-based applications? 

At this time, no, Docker for Windows Server 2016 does not support GUI-based applications. This is because Windows containers are based on either Nano or Core Server, which do not allow users to start up a GUI-based interface nor RDP into the container.

五、docker下载

docker官网:http://www.docker.com<
docker中文网站:https://www.docker-cn.com/
Docker Hub官网: https://hub.docker.com/

六、dock学习路线图

 

七、dock参考书

https://yeasy.gitbooks.io/docker_practice/content/introduction/what.htmlhttps://github.com/yeasy/docker_practice/blob/master/SUMMARY.md

git概述-git工作流

一、 概念

在项目开发过程中使用 Git 的方式。

二、分类

1、集中式工作流

像 SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有修改都提交到 Master 这个分支上。这种方式与 SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到。

2、GitFlow 工作流

Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。

3、Forking 工作流

Forking 工作流是在 GitFlow 基础上,充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受不信任贡献者的提交。

三、GitFlow 工作流详解

1、主干分支 master
主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境 完全一致。
2、开发分支 develop
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
3、bug 修理分支 hotfix
主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
4、准生产分支(预发布分支)release
较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后,可以视情况删除。
5、功能分支 feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。开发完成后会合并到开发分支。

git原理-hash与文件管理与分支管理

一、hash

哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
②哈希算法确定,输入数据确定,输出数据能够保证不变
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④哈希算法不可逆
Git 底层采用的是 SHA-1 算法。
哈希算法可以被用来验证文件。原理如下图所示:

二、Git 保存版本的机制

1、集中式版本控制工具的文件管理机制

以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

2、Git 的文件管理机制

Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,
Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。

3、Git 文件管理机制细节

(1)Git 的“提交对象”

(2)提交对象及其父对象形成的链条

三、Git 分支管理机制

1、分支的创建

2、分支的切换

 

git客户端-eclipse项目的git操作

最开始的时候,应该先从远程库fetch 到本地,本地merge后,才能提交到远程库,否则远程库会拒绝接收提交。

一、提交到本地库

1、新项目首先需要添加到暂存区

2、提交至本地库

3、图形化界面拖拽和快捷键

新建好的类可以,可以不用 Add to index 直接 commit 就行了,此时

还可以使用快捷键  cmmand + alt + 3

二、推送到远程库

三、从远程库clone到本地

eclipse 因为新建版本稍有变化,有的版本不能直接clone到工作区,需要在clone到别的地方,然后再从外部导入到工作区。

四、转换clone到本地的项目

因为上传到远程仓库的文件不包括eclipse的项目配置文件,所以clone到本地后,我们需要convert项目。

五、解决冲突

冲突文件→右键→Team→Merge Tool
修改完成后正常执行 add/commit 操作即可。

六、新建分支与合并分支

项目-->Team-->Switch To Other 页面中:可以对分支进行新建、删除、重命名和切换。 

主开发者:

本地新建 hot_fix分支:

修改好后,提交到本地库,然后push到远程仓库。【push到远程库方法也可以是如下方法】

协开发者:

从远程库下载hot_fix分支:

从本地master分支 切换到 远程hot_fix分支:

然后先切换到本地master分支:

接着再合并本地的 hot_fix分支:

最后 push 到 远程库。

 

 

git客户端-eclipse项目的git配置

一、eclipse查看git用户配置文件

二、eclipse项目初始化git

工程→右键→Team→Share Project→Git【我这边已没有git选项了,直接进入git配置页面】

三、eclipse项目配置git

1、配置项目的本地签名

2、配置git项目忽略文件

eclipse中的 Quick Access  搜索框中 输入  navigator,就能查看项目的所有文件了。

概念:Eclipse 特定文件
这些都是Eclipse 为了管理我们创建的工程而维护的文件,和开发的代码没有
直接关系。最好不要在Git 中进行追踪,也就是把它们忽略。
.classpath 文件
.project 文件
.settings 目录下所有文件
为什么要忽略Eclipse 特定文件呢?
同一个团队中很难保证大家使用相同的IDE 工具,而IDE 工具不同时,相关工
程特定文件就有可能不同。如果这些文件加入版本控制,那么开发时很可能需要为
了这些文件解决冲突。

GitHub 官网样例文件
https://github.com/github/gitignore
https://github.com/github/gitignore/blob/master/Java.gitignore
编辑本地忽略配置文件,文件名任意。

Java.gitignore 忽略配置文件如下:

# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

.classpath
.project
.settings
target

注意啦:下面这些是自己添加的忽略文件,其余的忽略文件是模板提供的。

.classpath
.project
.settings
target

在~/.gitconfig 【git的用户配置文件】文件中引入上述文件
[core]
excludesfile = /Users/cool/Java.gitignore
[注意:如果是Windows系统,这里的路径中就要使用“\”,不能使用“/”]