网络设备

交换机
距离终端用户最近的设备,用于终端用户接入网络、对数据帧进行交换
路由器
网络层设备,可以进行数据报文转发
防火墙
通过检测、限制、更改跨越防火墙的数据流控制网络间的安全通信,尽可能对外部屏蔽内网信息、结构及运行状况以确保安全。
无线设备
这里只讲AP(Access Point),即:无线接入点,作用是把局域网里通过双绞线传输的(有线)电信号经过编译转换为无线电信号再传递给电脑之类的无线终端;同时,又会把无线终端发送的无线信号转换成有线信号通过双绞线在局域网内传输;通过这种方式,形成无线覆盖(无线局域网)。
而AP又分为:无线胖AP(Fat AP)无线瘦AP(Fit AP)
**区别:**功能完善与否。
胖AP功能完整,能够独立工作,可以无线接入,也具备WAN、LAN端口,支持DHCP服务器、DNS服务器、MAC地址克隆、VPN接入以及防火墙等功能。通常自带完整的操作系统,可以独立完成拨号、路由等功能;例如我们的无线路由器。通俗来讲,胖AP就是带管理功能的AP,同时可以广播SSID且可以连接终端的AP。
瘦AP在功能上进行削减,无法独立工作,需要连接到控制它的“大脑”才能工作。形象理解就是对胖AP进行“瘦身”,去掉路由、DNS解析、DHCP服务器等功能,仅剩无线接入部分,仅提供信号转换/接收/发送功能。

OSI七层模型

应用层
提供应用接口,直接面对用户,比如我们使用的qq、微信,正是在应用层上进行的
表示层
进行数据格式的转换,以确保一个系统生成的应用层数据能够被另一个系统的应用层所识别和理解;表示层提供各种用于应用层数据的编码和转换的功能;通俗来讲,就是在传输过程中,用来确保我们发送的数据不会因系统不同而混乱。
会话层
在通信双方之间建立、管理和终止会话;系统帮助我们区分数据传输对象,确保A发给B的消息不会错发到C
传输层
建立、维护和取消一次端到端的数据传速过程,控制传输节奏的快慢,调整数据的排序等等
网络层
定义逻辑地址,实现数据从源到目的地的转发
数据链路层
将分组数据封装成帧,在数据链路上实现数据的点到点、点到多点的直接通信
物理层
在媒介上传输比特流

TCP/IP参考模型

相较于OSI模型更加简便实用,其缩减为五层,并在实际生活中广泛运用;
原OSI七层模型的应用层、表示层、会话层在TCP/IP模型中合并为应用层;其余不变。
TCP/IP常见协议在不同层的应用
在应用层
TCP协议:(协议后面为端口号,用以区分应用层的运用程序)
HTTP 80:采用C/S架构,用户访问一个域名,服务器则返回一个html文件
Telnet 23:为用户提供在本地计算机上完成远程设备工作的能力,相当于在自己的主机上操纵别人的设备
FTP 20,21:一个用于从一台主机传送文件都另一台主机的协议,用于文件的下载和上传,采用
C/S结构(客户端/服务器),常用于设备升级
SMTP 25
UDP协议:(相较于TCP协议,UDP协议的传输速度更快,但不精准,可能造成数据丢失)
TFTP 69
(TCP协议传输慢,但数据较为精确,不易丢失)

在传输层
传输层协议接收来自应用层协议的数据,封装上相应的传输层头部,帮助其建立“端到端”的连接,该层的PDU被称为“段”
网络层
负责数据从一台主机到另一台主机之间的传递,该层的PDU被称为包
数据链路层
位于网络层和物理层之间,可以向网络层的IP、IPv6等协议提供服务,数据链路层的PDU被称为帧
交换机维护MAC地址表
路由器维护路由表
MAC地址(以太网地址/物理地址)不变,但IP可以改变
地址解析协议ARP:已知IP,获取MAC,广播询问,单播响应
ARP工作原理:发送数据前,设备先查找ARP缓存表,如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去,如果缓存表中不存在,则通过ARP协议获取;
获取MAC地址的过程:主机1通过发送ARP Request报文获取主机2的MAC地址,但并不知道目的MAC地址,因此ARP Request报文内的目的端MAC地址为0

TCP的建立

为何建立TCP连接?

通信分为面向连接和无连接,面向连接通信的形象比喻是:A给B打电话,B接收通话且A不挂断,则AB连接建立成功,双方正常通信,若B拒绝或A突然挂断,则通信无法进行;无连接通信就像是发短信,A给B发短信,B未必能收到也未必有回应,二者并不需要建立连接。

面向连接通信的优缺点:优点:可靠性高,毕竟一层层建立连接;缺点:为了保证可靠性,整个过程很麻烦,下文会提。

如何保证可靠性?

1、三次握手

双网口 nginx 双网口AP与单网口AP区别_网络


简单理解:客户A向服务端发送一个请求,SYN seq = x,服务端B收到请求并回应SYN seq = y,ACK = x + 1,A再次发包:ACK = y + 1 表示收到,TCP建立完成。

带着问题研究具体过程

1、为什么非要三次握手?
第一次握手:客户端发送网络包,若服务端收到则我们能确定客户端的发送能力、服务端的接受能力都正常;
第二次握手:服务端发包,若客户端收到,则客户端可以确定服务端的接包、发包能力正常,但服务端无法确定客户端的接收能力是否正常;
第三次握手:客户端发包,服务器收到,解决了第二次握手遗留的问题:服务端得出结论:客户端的接收、发送能力都正常。
综上所述:三次握手却能确保一个连接的准确性,换句话说,能不能简便些,两次握手确定一次连接?那过程会是这样:客户端发送一个请求报文,因网络延迟一直未发送成功,于是又发了一个,然后服务端收到了第二个请求报文,也做了回应,于是客户端开始传输数据,而不是再次确定做第三次握手,于是数据传输完成后连接就被释放了;后来客户端第一次发送的请求包到了,服务端误以为需要建立连接,便发送一个回应包,等待客户端发送数据,也就造成了资源浪费。
2、什么是半连接队列?
服务器第一次接收到客户端的SYN后就会处于SYN_RCVD状态,此时双方还没有完全建立连接,服务器会把这种状态下请求连接放在一个队列里,这个队列成为“半连接队列”;有半连接自然就有全连接,即:已完成三次握手,这样建立起来的连接就会放在全连接队列中,若此队列已满则可能出现“丢包”。
3、关于SYN-ACK重传次数
服务器发送完SYN-ACK包,如果未受到客户确认包,服务端会进行“首次重传”,等待一段时间仍未收到客户确认包,会进行第二次、第三次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。(每次重传等待的时间不一定相同,一般呈指数型增长,间隔时间可能为1s,2s,4s,8s,16s…
4、三次握手过程中可以携带数据吗?
前两次都不行,第三次可以。因为第一次握手如果可以携带数据,如果有人要恶意攻击服务器的话,那ta只需要在第一次握手中的SYN报文投入大量的数据,因为攻击者完全不必理会服务器的接收、发送能力是否正常,打就完了,让服务端花费大量时间、空间接收这些内存。因此我们规定第一次握手不可以携带数据,否则服务端容易遭到攻击。
5、SYN攻击是什么?
服务器端的资源分配是在第二次握手时分配的,客户端的资源则是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。所谓SYN攻击就是客户端在短时间内伪造大量不存在的IP,并向服务端不断发送SYN包,服务器则需要回复确认包,还得等待客户端确认,由于源IP并不存在,所以服务端需要不断重发直到达到上限次数才停止;攻击者伪造的SYN包将长时间占用未连接队列,从而导致正常的SYN请求因为队列满了而被丢弃。所谓SYN攻击,就是一种典型的Dos攻击。至于如何检测这种攻击:当我们在服务器上看到一堆半连接状态,甚至源IP是随机的,基本上这就是遇到了SYN攻击,如果是在linux上可以用netstats来检查SYN攻击,指令:netstat -n -p TCP | grep SYN_RECV
常见防范措施:缩短超时时间;增加最大半连接数;过滤网关防护;SYN cookies技术。
2、窗口滑动机制
窗口分类: 固定、滑动
固定窗口存在的问题:
固定窗口:A与B通信,假设现在窗口大小为1,则A每次只能发一个数据给B,直到B接收了,A才能再发下一个,简而言之:若窗口过小,当我们需要传输比较大的数据时,需要不停地和对方确定数据,造成巨大延迟。
若窗口过大,接收方B无法完全接收第一次A发来的数据,但是第二次A又发来同样的数据量,B仍然无法接收完全,以致网络拥堵。因此我们主要采用滑动窗口。
滑动窗口
通俗来说是一种流量控制技术,本质上是描述接收方B数据缓冲区大小的数据,发送方A根据这个数据来计算最大传输量,若A发现B的窗口大小为0,则停止发送数据,会等到B窗口不为0时才发送。
工作原理 :A第一次发送数据时,窗口大小取决于链路带宽,假设第一次发送10个数据,B收到数据后会对数据进行确认告诉A下次希望接受的数据是多少,后面再做相应调整。窗口的大小并非一成不变,不是说第一次协商后就不会发生改变,还是那句话,取决于链路带宽。

TCP的关闭

四次挥手
建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由于TCP的半关闭造成的,所谓半关闭,即:TCP提供了连接的一端在结束他的发送后还能接收来自另一端数据的能力。
TCP连接的拆除需要发送四个包,故名为“四次挥手”,客户端与服务端均可主动发起挥手动作。
刚开始双方均处于ESTABLISHED状态,假设客户端先发起关闭请求。则过程如下:
第一次挥手:客户端发送一个FIN报文,报文中指定一个序列号,此时客户端处于FIN_WAIT1状态,即:faculty连接释放报文段(FIN=1,序列号seq = u),并停止发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。

第二次挥手:服务端收到FIN后,发送ACK报文,并把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态。即:服务端收到连接释放报文段后发出确认报文段(ACK=1,确认号ack = u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时TCP处于半关闭状态,客户端到服务端的连接释放,客户端收到服务端的确认后进入FIN_WAIT2状态,等待服务端发出的连接释放报文段。

第三次挥手:如果服务端也想断开连接,会和客户端的第一次挥手一样,发给FIN报文,且指定一个序列号,此时服务端处于LAST_ACK的状态。即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序列号seq=W,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。

第四次挥手:客户端收到FIN之后,一样发送一个ACK报文作为应答,且把服务端的序列号值+1作为自己ACK豹纹的序列号值,此时客户端处于TIME_WAIT状态。需要过一段时间以确保服务端收到自己的ACK报文之后才会进入CLOSED状态,服务端收到ACK报文之后,就处于关闭连接的状态,也就是处于CLOSED状态。
同样,我们带着问题来研究四次挥手
1、为什么挥手非得四次?
当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来做应答的,SYN报文是用来同步的,但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端:已收到FIN报文,但只有等到服务端所有报文都发送完了,才能发送FIN报文,因此不能一起发送,所以需要四次挥手。
2、关于2MSL等待状态
TIME_WAIT状态也成为2MSL等待状态,每个具体TCP事先必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间,这个时间是有限的,因为TCP报文段以IP数据包在网络内传输,而IP数据包则有限制其生存时间的TTL字段。
对于一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭并回发最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可让TCP再次发送最后的ACK一放这个ACK丢失(另一端超时并重发最后的FIN)。
这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的接口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被利用。这个连接只能在2MSL结束后才能再被使用。
3、四次挥手释放连接时,等待2MSL的意义?
MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。
两个理由:
保证客户端发送的最后一个ACK报文段能够到达服务端。
这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,服务端超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到CLOSED状态。
防止“已失效的连接请求报文段”出现在本连接中。
客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
4、为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?
理论上,四个报文都发送完毕,就可以直接进入CLOSE状态了,但是可能网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文