应用,主机,网络,数据,数据单位数据库
应用层指的是完成应用进程间
的通讯的网络协议
。应用层协议定义的是应用进程间
的通讯和交互规则
。缓存
对于不一样的网络应用须要不一样的应用层协议。如域名系统 DNS,互联网的 HTTP 协议,邮件的 SMTP 协议等等。服务器
域名系统(Domain Name System缩写DNS,Domain是因特网的一项核心服务,它做为能够将
域名和IP地址相互映射的分布式数据库
,可以令人不用去记住可以被机器直接读取的IP数串。网络
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最普遍的网络协议。全部的 WWW(万维网) 文件都必须遵照这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。(百度百科)多线程
运输层是完成两台主机进程之间
的通讯提供通用的数据传输服务
。通用的
是指多种应用
可使用同一个
运输层服务。分布式
因为主机可同时运行多线程,所以运输层有复用
和分用
的功能。线程
多个应用
层进程可同时使用
下面运输层服务
。分别
交付上面应用层中的相应
进程。TCP提供可靠的通讯传输 | UDP则常被用于让广播和细节控制交给应用的通讯传输。
设计
主机间通讯会通过多链路
,多通讯子网
。网络层是选择
合适的网间路由
和交换结点
, 确保数据及时传送。code
在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP / IP 体系结构中,因为网络层使用 IP 协议,所以分组也叫 IP 数据报,简称数据报。cdn
数据
链路层简称为链路层。主机通讯老是在一段一段
的链路上传送的,这就须要使用专门的链路层的协议。
传送数据时,数据链路层将数据报文组装成帧传输,每一帧包括数据和必要的控制信息(如:同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端可以知道一个帧从哪一个比特开始和到哪一个比特结束。
数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。
控制信息还使接收端可以
检测
到所收到的帧中有无差错
。若是发现差错,数据链路层就简单地丢弃
这个出了差错的帧,避免浪费网络资源。
若是须要改正数据在链路层传输时出现差错(这就是说,数据链路层不只要检错,并且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
在物理层上所传送的数据单位是比特。
物理层是实现
相邻节点之间比特流的透明传送
,尽量屏蔽物理设备的差别。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化
服务器第一次收到客户端的 SYN 以后,就会处于 SYN_RCVD 状态,此时双方尚未彻底创建其链接,服务器会把此种状态下请求链接放在一个队列里,咱们把这种队列称之为半链接队列。
固然还有一个全链接队列,就是已经完成三次握手,创建起链接的就会放在全链接队列中。若是队列满了就有可能会出现丢包现象。
这里在补充一点关于SYN-ACK 重传次数的问题: 服务器发送完SYN-ACK包,如未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。若是重传次数超过系统规定的最大重传次数,系统将该链接信息从半链接队列中删除。 注意,每次重传等待的时间不必定相同,通常会是指数增加,例如间隔时间为 1s,2s,4s,8s......
SYN攻击 - 典型的DDOS攻击之一
攻击原理:在三次握手中,Server发送SYN-ACK后,收到Client的ACK以前的TCP链接称为半链接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。
SYN攻击就是Client在短期内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,因为源地址是不存在的,所以,Server须要不断重发直至超时,这些伪造的SYN包将产时间占用未链接队列,致使正常的SYN请求由于队列满而被丢弃,从而引发网络堵塞甚至系统瘫痪。
检测SYN攻击的方式很是简单,即当Server上有大量半链接状态且源IP地址是随机的,则能够判定遭到SYN攻击了,使用以下命令可让之现行:netstat -nap | grep SYN_RECV
ISN随时间而变化,所以每一个链接都将具备不一样的ISN。ISN能够看做是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在之后又被传送,而致使某个链接的一方对它作错误的解释。 三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。若是 ISN 是固定的,攻击者很容易猜出后续的确认号,所以 ISN 是动态生成的。
第一次、第二次握手不能够携带数据.第三次握手的时候,是能够携带数据的。 由于第一次握手能够携带数据的话,若是有人要恶意攻击服务器,那他重复在第一次握手中的 SYN 报文中放入大量的数据,这会让服务器花费不少时间、内存空间来接收这些报文。
简单的缘由就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来讲已经创建起链接了,而且也已经知道服务器的接收、发送能力是正常,能携带数据也没啥毛病
三次握手的目的是创建可靠的通讯信道,说到通信,简单来讲就是数据的发送与接收,而三次握手最主要的目的就是双方确认本身与对方的发送与接收是正常的。
因此三次握手就能确认双发收发功能都正常,缺一不可。
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
双方通讯无误必须是二者互相发送信息都无误。传了 SYN,证实发送方到接收方的通道没有问题,可是接收方到发送方的通道还须要 ACK 信号来进行验证。
彻底可靠的通讯协议是不存在的。在通过三次握手以后,客户端和服务端已经能够确认以前的通讯情况,都收到了确认信息。因此即使再增长握手次数也不能保证后面的通讯彻底可靠,因此是没有必要的。
ACK报文是用来应答的,SYN报文是用来同步的。 当服务端收到FIN报文时,并不会当即关闭SOCKET,只能先回复一个ACK报文,告诉客户端,"你发的FIN报文我收到了"。只有等到我服务端全部的报文都发送完了,我才能发送FIN报文,所以不能一块儿发送。故须要四次挥手。
2MSL等待状态
TIME_WAIT状态也成为2MSL等待状态。每一个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,由于TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。
为了保证客户端发送的最后一个ACK报文段可以到达服务器。由于这个ACK有可能丢失,从而致使处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,从新启动时间等待计时器。最后客户端和服务器都能正常的关闭。
假设客户端不等待2MSL,而是在发送完ACK以后直接释放关闭,一但这个ACK丢失的话,服务器就没法正常的进入关闭链接状态。
理论上,四个报文都发送完毕,就能够直接进入CLOSE状态了,可是可能网络是不可靠的,有可能最后一个ACK丢失。因此TIME_WAIT状态就是用来重发可能丢失的ACK报文。