本文对工程网络中的知识点作下总结,基本都是用到的。真实的网络搭建:https://segmentfault.com/a/11...,二层主要有个VLAN,公司部署网络基本都是这个。三层主要是路由协议。还介绍了些常见的应用协议。最后介绍了些网络调式工具。html
二层
交换机:硬件,快,端口多。二层/三层(多用于LAN)
数据链路地址的目的是在同一网络中将数据链路帧从一个网络接口发送至另外一个网络接口,MAC地址是物理植入网卡的48比特意址(路由器也有mac地址)web
ARP(根据IP地址获取mac地址,将ARP请求帧广播到本地网络上的全部主机),LAN交换机MAC地址表的动态更新:交换机学习“源地址”(记录来源端口和mac地址),基于“目的地址”转发,没有在表中找到目的MAC地址,交换机会转发到除了进入端口之外的全部端口泛洪(flooding)
算法
VLAN

为什么要划分VLAN?防止广播flooding扩散,广播只在VLAN上
交换机端口类型:
1.正常只有内部可通讯,accesslink 能够根据端口固定划分VLAN,能够根据mac,ip动态划分
2.同一VLAN夸交换机:汇聚link。(只对链接同一VLAN转发,同一交换机找不到才到另外一个)
跨VLAN:三层交换机/路由
对个应公司网络架构:核心交换机是三层,接入层是二层,中间其实还有个汇聚层能够作防火墙等segmentfault
三层
- 路由:软件实现,功能更多,安全认证等,端口少。三层高
协议:mac+ip
转发过程:PC1经过将本身的IPv4地址与子网掩码作与操做,来判断PC 1所属的网段。接下来,PC 1对目的IPv4地址与PC 1的子网掩码作一样的与操做。若是目的网络地址与PC 1网络相同,则PC 1不使用默认网关,而是在ARP缓存中查找目的IPv4地址的设备MAC地址。若是MAC地址不在缓存中,则PC 1产生一个ARP请求来获取地址并将报文发给目的地址。若是目的网络地址位于另外一网络,则PC1将报文转发至默认网关,默认网关的MAC地址同上。
根据得到路由的方式能够将其分为静态路由和动态路由,静态路由就是管理员静态配置的路由,动态路由则是路由器经过算法动态地学习和调整而获得的路由。而常说的路由协议就是指这些动态路由的学习算法,根据其做用域的不一样,又可分为内部网管协议(IGP)和边界网络协议(BGP);内部网络协议包括RIP,OSPF等。这几类路由协议,小规模私有网络IGP(OSPF),大规模私有网络IBGP,互联网EBGP
- IP地址:
在不考虑子网的状况下,ip地址分类:
A,最高位必须是0,由1字节的网络地址和3字节主机地址组成(数字0和 127不做为A类地址,数字127保留给内部回送函数,而数字0则表示该地址是本地宿主机,不能传送,0.0.0.0~126.255.255.255),
B:最高位10,由2个字节的网络地址和2个字节的主机(128.0.0.0~191.255.255.255),
C:110,3字节的网络地址和1字节的主机地址(192.0.0.0~223.255.255.255),
D:1110用于广播,
E:11110保留
在IP地址3种主要类型里,各保留了3个区域做为私有地址(内网),其地址范围以下:
A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255
IP地址由此被分为三个部分:网络ID,子网ID与主机ID(这两部分共同为原来的主机地址),根据子网掩码来判断子网ID与主机ID,
假设将B类网络154.71.0.0划分5位为子网ID,11位为主机ID。所以,子网掩码有16个1表明网络部分(B类网络),接下来5个1做为子网部分,11个0用做主机ID。二进制数表示为11111111 11111111 11111000 00000000,十进制数表示为255.255.248.0,新的表达法为154.71.150.42/21。IP地址和子网掩码作与操做获取子网地址,以便路由器找到网络。21意思是子网掩码为21个1后面0,即255.255.248.0
协议
路由相关
UDP
- 特色:
1.无链接
2.不可靠
3.面向报文,无边界的,添加首部后直接交付给IP层,不合并也不拆分。因此报文太长后,IP层在传输时会分片,下降效率,过短,IP数据报的首部相对长度太大,也下降IP层效率
4.没有拥塞控制
5.支持一对一,一对多,多对一,多对多的交互通讯
6.首部开销小,只有8字节
- UDP首部:源端口号,目的端口号,长度,校验和,各2字节
计算校验和方法:在首部前临时增长一个伪首部:源IP地址(4)目的IP地址(4)0(1)17(1)UDP长度(2),将伪首部,首部,数据(非偶数字节则补0)按二进制运算求和,反码做为校验和
TCP
- 特色
1.面向链接
2.可靠
3.只能一对一链接
4.全双工通讯,通讯双方在任什么时候候均可以发送数据,设有发送缓存和接受缓存
5.面向字节流,先把字节写入缓存,一次发送一个数据块(加TCP首部),一块包含多少字节受窗口值和网络拥塞程度决定
-
TCP首部:20B~60B,固定部分:数组
源端口号(2),目的端口号(2);
序号(4)每一个字节都按顺序编号,首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号;
确认号(4)但愿收到对方下一个报文段的第一个数据字节的序号,若确认号\=N,表示N-1为止的全部数据都已正确收到
数据偏移(4bit)首部长度,以4字节长度为计算单位,最多可表示15*4\=60B
保留(6)
紧急URG(1bit)高优先级数据,不安排队顺序传送
确认ACK
PUSH,发送端 : TCP将数据包置上PUSH标志时,表示这个数据应该被当即发送,而不要等待额外的数据。 接收端 : 接收端接受到带有PUSH标志的数据时,应该接接受缓存中收到的全部数据(包含当前带PUSH标示的数据包)应该当即提交到应用层。当前没有API通知TCP哪些数据须要被设置PUSH标示,彻底由TCP自行判断决定。
复位RST,必须释放链接
同步SYN
终止FIN
窗口(2)指该方接收窗口的窗口值,容许对方发送的数据量
校验和(2)计算方法和UDP同样,伪首部中17改为6便可
紧急指针(2)当URG=1时,指出紧急数据的字节数
- 可靠传输实现
滑动窗口,发送方:通过确认的就往前移动窗口,超时重传,接收方:非按序到达的暂存,确认的都达到后发送确认信息(积累确认),窗口前移。
TCP流量控制:利用滑动窗口实现,接收方给发送方规定窗口大小。
TCP拥塞控制:发送方维持一个拥塞窗口,只要网络没出现拥塞,拥塞窗口就再增大一些,出现拥塞,就减少一些
慢开始(由小到大逐渐增大发送窗口,指的是开始很小,增加速率不慢),拥塞避免(线性增加),快重传,快恢复(当连续收到三个重复确认,将慢开始门限执行乘法减少,而后开始执行拥塞避免)
发送方的窗口大小=min(拥塞窗口大小,接收方窗口)
- TCP链接管理
1.三次握手创建链接:

这里为何要再发一次ACK=1的确认呢?若是B应答就创建链接,可能出现这种状况:A发送一次请求后延迟,从新发送一次,B接受一个后创建了链接,传完以后,B又收到了以前延迟的请求,又创建了链接,可是A并无数据要传,浪费了B的资源。发送SYN不能携带数据,可是会消耗一个序号,ACK若是不携带数据就不会消耗序号,因此下一个报文段seq=x+1。
2.四次挥手释放链接:

A收到第一次B的确认后就不能传数据了,A要等待2MSL的缘由:一为了保证最后一条确承认以到达B,由于若A发完就关闭了,若此确认丢失,A也收不到B的丢失确认也没法从新发送。二是为了再此时间段内让以前丢失重发的报文都从网络中消失,再开始下一次链接。
在没有数据发送的状况下。直接发送FIN/ACK四次变三次。
TIME_WAIT是确定必不可少的
3.socket状态
- TCP窗口与重传机制
发送方窗口快照:C3可能为0

假设已发送未确认字节(32至45)分为4段传输:32-34,35-36,37-41,42-45。第1,2,4已经到达,而3段没有收到。接收方只会发回32-36的确认信息。接收方会保留42-45但不会确认
发送设备以后会中止发送,窗口停留在37-41。TCP包括一个传输及重传的计时机制。TCP会重传丢失的片断。对于42-45的处理看SCAK。
1.基于定时器的重传(timeout or timer-based retransmission),这种重传方式是发出去的数据在RTO超时后尚未收到对应的ACK就会进行超时重传。
2.另外TCP还有一种基于ACK报文结构顺序的重传,这种重传叫作快速重传(fast retransmission或者fast retransmit),当TCP注意到累计ack(即TCP头中的ack number)再也不推动(当收到p1,p3,p4时都会回p1的ack)或者接收端经过SACK信息指示发送端接收端存在洞(hole)时候就会触发发送端的重传,一般来讲快速重传比超时重传更高效
对于1:浏览器
每一个片断在发送是都启动重传计时,当超过这个RTO尚未确认就重传,确认则<=该序号的都移出窗口。
RTO(Retransmission Timeout),RTO应该根据环回时间RTT(round-trip-time)来估计。环回时间应该包括三部分:数据包传送过的时间,接收端处理这个数据包并产生ACK的时间,ACK确认包返回的时间。RTO计算:https://www.cnblogs.com/lshs/...
SACK的选择重传机制:链接的两方设备必须同时支持这一功能,经过链接时使用的SYN片断来协商是否容许SACK
在4个片断的状况下,若是客户端接收到片断4而没有接收到片断3,当它发回确认号为201(片断1和片断2)的确认信息,其中包含一个SACK选项指明:“已接收到字节361至500,但还没有确认”。若是片断4在片断1和2以后到达,上述信息也能够经过第二个确认片断来完成。服务器确认片断4的字节范围,并为片断4打开SACK位。当片断3重传时,服务器看到片断4的SACK位为1,就不会对其重传。
在片断3重传以后,片断4的SACK位被清除。这是为了防止客户端出于某种缘由改变片断4已接收的想法。客户端应当发送确认号为501或更高的确认信息,正式确认片断3和4接收到。若是这一状况没有发生,服务器必须接收到片断4的另外一条选择确认信息才能将它的SACK位打开,不然,在片断3重传时或计时器超时的状况下会对其自动重传。缓存
-
提高效率
对于ack(1.累计【累计发送连续顺序接收最大的】2.延时【与数据一块儿发送,最长等待时间通常200ms】)。对于数据1.等大包,2。拥塞控制
Nagle算法,任意时刻,最多只能有一个未被确认的小段(对于发送数据包)。安全
Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):
(1)若是包长度达到MSS,则容许发送;
(2)若是该包含有FIN,则容许发送;
(3)设置了TCP_NODELAY选项,则容许发送;
(4)未设置TCP_CORK选项时,若全部发出去的小数据包(包长度小于MSS)均被确认,则容许发送;
(5)上述条件都未知足,但发生了超时(通常为200ms),则当即发送。
delayed ack算法:ACK响应,等待一个超时或者知足特殊条件时再发送。对于Linux实现,这些特殊条件以下:服务器
1)收到的数据已经超过了full frame size
2)或者处于快速回复模式
3)或者出现了乱序的包
4)或者接收窗口的数据足够多
默认状况下,发送数据采用Nagle 算法。这样虽然提升了网络吞吐量,可是实时性却下降了,在一些交互性很强的应用程序来讲是不容许的,使用TCP_NODELAY选项能够禁止Nagle 算法。此时,应用程序向内核递交的每一个数据包都会当即发送出去。须要注意的是,虽然禁止了Nagle 算法,但网络的传输仍然受到拥塞控制和delay ack的影响。delay ack能够经过TCP_QUICKACK使得机内快速回复模式
Nagle算法彻底不受用户socket的控制,你只能简单的设置TCP_NODELAY而禁用它
CORK算法经过设置或者清除TCP_CORK使能或者禁用之,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去网络
- setsockopt选项
TCP_NODELAY禁用nagle,不会有小包等待,提升吞吐量,下降延迟。
TCP_CORK 尽量多的发送数据,与TCP_NODELAY相反,适用文件服务。
TCP_QUICKACK 快速回复模式,AACK不累计
SO_LINGER做用于TCP close,默认close会当即返回,将丢弃缓存区内的全部数据而且当即终止链接(即发送RST数据包)。设置该选项,只关闭写,不关闭读,保证读Buffer没了,就不会发RST,而是正常的四次挥手。
SO_KEEPALIVE 没有数据时按期发送探测包。
SO_REUSEADDR 重用处于TIME_WAIT状态的socket。
TCP_MAXSEG 设置MSS,即通告对方的窗口大小。
TCP_DEFER_ACCEPT 防止accept以后马上读数据,而要等client发过来数据再去读
HTTP
内容比较多,参考http权威读书指南。讲一些实际上应用中会用到和注意的
协议格式响应略
- HTTP依赖TCP性能
TCP创建链接创建握手,TCP慢启动拥塞机制,数据汇集的Nagle算法,用于捎带确认的TCP延迟确认算法,TIME_WAIT时延和端口耗尽
延迟确认:因为确认报文很小,TCP容许在输出数据分组捎带确认报文,延时确认算法会在一个特定的窗口时间(一般是100-200毫秒)内将输出确认存放在缓冲区中,以寻找可以捎带他的输出数据分组,若是在该时间段内没有输出数据分组,确认信息再单独发送。可是HTTP具备双峰特性的请求,当但愿有反方向回传时,恰恰没有那么多分组
慢启动:新创建链接发送报文数量慢启动过程
Nagle算法:TCP至少40字节头,Nagle算法鼓励发送全尺寸段,只有当全部其余分组都被确认或者缓存中积累了足够发送一个全尺寸分组的数据时,才会将缓存数据发送出去。与延迟确认交互存在问题,确认分组自身会被延迟100-200毫秒,http小报文没法填满一个分组。HTTP尝尝会设置TCP_NODELAY禁用Nagle算法
TIME_WAIT:关闭链接时,会在内存中记录最近关闭链接的IP地址和端口号,一般会维持2MSL,以确保这段时间内部会建立具备相同地址和端口号的新链接。一般不会有什么问题,可是在单台机器上测试时,只有源端口号可变,会出现端口号耗尽状况,测试中须要注意。
- 链接
connection首部的值:只与本链接有关的首部(发往下一跳要删除);任意本链接有关的非标准选项,close(关闭持久链接),在到达一跳时要删除全部的值再自行处理。
持久链接:1.1,默认开启,除非Connection: Close;
管道:在1.1keep-alive基础上,第一个发送以后就能够不等响应发送第二个,要求服务端响应保持按顺序,客户端重传处理。不能用于POST非幂等(必定要等响应才决定是否重发)方法。
关闭链接:当一端关闭输入链接,另外一端又发来消息,操做系统会发送一个错误信息,并删除对端还未读取的全部缓存,对于管道,可能会由于一个新链接删除不少缓存未读取的链接数据。应该双方否只关闭输出链接,收到双方关闭信息后再彻底关闭。
并行链接:在客户端带宽不足时没有提高;消耗更多内存资源;服务端压力大。通常浏览器会限制最多并发4个,服务端能够随意关闭特定客户端超过链接数的请求。
- web的结构组件:代理(转发全部web流量的可信任中间节点,via),缓存,网关(将HTTP流量转化为其余协议),隧道(在HTTP链接中转发非HTTP数据好比在ssl应用上以下图),agent代理(发起HTTP请求浏览器等),web服务器
- content相关:
分块编码chunked:把报文分割为若干个大小已知的块,块之间是紧挨着发送的,这样就不须要在发送以前知道整个报文的大小了。
范围请求Range,响应Accept-ranges代表接收范围请求,值为单位,若一个请求包含多个范围,响应有Content-Type: multipart/byteranges.
- HTTP2.0
在底层传输协议之上分为三层:报文传输,远程操做调用,web应用功能。
报文传输:对报文进行管道话和批量化传输,以下降往返时延;重用链接,以下降时延,提升传输带宽;在同一条链接上并行的复用多个报文流,在防止报文流饿死的同事优化共享链接;对报文进行有效的分段,使报文边界的肯定更加容易。
webmux:一个复杂的高性能报文系统,能够在一个复用的TCP链接上并行传输报文,能够对以不一样速度产生和消耗独立报文流进行高效的分组,并将其复用到一条或少数几条TCP链接上去。
远程调用:二进制连接协议
-
HTTPS
SSL 基于TCP,SSL不是简单地单个协议,而是两层协议;SSL记录协议(SSL Record Protocol)为多种高层协议(SSL握手协议,SSL修改密码参数协议,SSL报警协议)提供基本的安全服务。
0x01 对对称加密的通俗理解
即通讯的双方都使用同一个秘钥进行加解密
0x02 对非对称加密算法的通俗理解 [ RSA ]
私钥 + 公钥= 密钥对
即用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密
其实这个很容易理解,由于通讯双方的手里都有一套本身的密钥对,通讯以前双方会先把本身的公钥都先发给对方
而后对方再拿着这个公钥来加密数据响应给对方,等到到了对方那里,对方再用本身的私钥进行解密,就这么简单
0x03 非对称加密所形成的速度慢的问题解决办法
(1) 先生成一个对称加密算法的密钥,用RSA的方式先安全的发给对方
(2) 随后就再也不用RSA了,只用这个对称加密的密钥来互相通讯

-> 客户端向服务端发送请求
-> 服务端返回数字证书
-> 客户端用本身的CA[主流的CA机构证书通常都内置在各个主流浏览器中]公钥去解密证书,若是证书有问题会提示风险
-> 若是证书没问题客户端会生成一个对称加密的随机秘钥而后再和刚刚解密的服务器端的公钥对数据进行加密,而后发送给服务器端
-> 服务器端收到之后会用本身的私钥对客户端发来的对称秘钥进行解密
THRIFT
Thrift是一个跨语言的服务部署框架。支持协议:只关心TBinaryProtocol。传输层支持:只关心TFramedTransport,服务模型:用这个TNonblockingServer,TProcessor 服务调用组件,单独将框架时讲解,这里说下协议。
TBinaryProtocol的实现。
writeMessgeBegin方法写了消息头,包括4字节的版本号和类型信息,字符串类型的方法名,4字节的序列号seqId
writeFieldBegin,写了1个字节的字段数据类型,和2个字节字段的顺序号
writeI32,写了4个字节的字节数组
writeString,先写4字节消息头表示字符串长度,再写字符串字节
writeBinary,先写4字节消息头表示字节数组长度,再写字节数组内容
readMessageBegin时,先读4字节版本和类型信息,再读字符串,再读4字节序列号
readFieldBegin,先读1个字节的字段数据类型,再读2个字节的字段顺序号
readString时,先读4字节字符串长度,再读字符串内容。字符串统一采用UTF-8编码
故障排查
tcpdumpwiresharkping经过netstat进行流量测量,netstat -i(获取快照),spray -c1000 205.153.63.239(模拟发送数据),netstat -p tcp -s -s(-s输出详细信息)ttcpnetperfiperftreno