TCP知识概要

谈下你对五层网络协议体系结构的理解?

应用,主机,网络,数据,数据单位数据库

  1. 应用层 - 应用间通讯协议,不一样应用使用不一样协议 HTTP,SMTP
  2. 运输层 - 主机间通讯服务,运输层复用、分用
  3. 网络层 - 选择合适 网间路由、交换结点,经过 多链路、多通讯子网
  4. 数据链路层 - 切割报文,让他在链路上 一段段 传输
  5. 物理层 - 数据单位是比特,让比特流运输无视设备差别

应用层

应用层指的是完成应用进程间的通讯的网络协议。应用层协议定义的是应用进程间的通讯和交互规则缓存

对于不一样的网络应用须要不一样的应用层协议。如域名系统 DNS,互联网的 HTTP 协议,邮件的 SMTP 协议等等。服务器

域名系统

域名系统(Domain Name System缩写DNS,Domain是因特网的一项核心服务,它做为能够将域名和IP地址相互映射的分布式数据库,可以令人不用去记住可以被机器直接读取的IP数串。网络

HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最普遍的网络协议。全部的 WWW(万维网) 文件都必须遵照这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。(百度百科)多线程

运输层

运输层是完成两台主机进程之间的通讯提供通用的数据传输服务通用的是指多种应用可使用同一个运输层服务。分布式

因为主机可同时运行多线程,所以运输层有复用分用的功能。线程

  • 复用就是指多个应用层进程可同时使用下面运输层服务
  • 分用是运输层把收到的信息分别交付上面应用层中的相应进程。

运输层主要使用如下两种协议

  1. 传输控制协议 TCP(Transmisson Control Protocol)--提供面向链接的,可靠的数据传输服务。
  2. 用户数据协议 UDP(User Datagram Protocol)--提供无链接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

UDP 的主要特色

  • UDP 是无链接的;
  • UDP 使用尽最大努力交付,即不保证可靠交付,所以主机不须要维持复杂的连接状态(这里面有许多参数);
  • UDP 是面向报文的;
  • UDP 没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如 直播,实时视频会议等);
  • UDP 支持一对1、一对多、多对一和多对多的交互通讯;
  • UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

TCP 的主要特色

  • TCP 是面向链接的。(就好像打电话同样,通话前须要先拨号创建链接,通话结束后要挂机释放链接);
  • 每一条 TCP 链接只能有两个端点,每一条TCP链接只能是点对点的(一对一);
  • TCP 提供可靠交付的服务。经过TCP链接传送的数据,无差错、不丢失、不重复、而且按序到达;
  • TCP 提供全双工通讯。TCP 容许通讯双方的应用进程在任什么时候候都能发送数据。TCP 链接的两端都设有发送缓存和接收缓存,用来临时存放双方通讯的数据;
  • 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅当作是一连串的无结构的字节流。

TCP\UDP的区别

TCP提供可靠的通讯传输 | UDP则常被用于让广播和细节控制交给应用的通讯传输。
设计

图片描述

网络层

主机间通讯会通过多链路多通讯子网。网络层是选择合适的网间路由交换结点, 确保数据及时传送。code

在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP / IP 体系结构中,因为网络层使用 IP 协议,所以分组也叫 IP 数据报,简称数据报。cdn

数据链路层

数据链路层简称为链路层。主机通讯老是在一段一段的链路上传送的,这就须要使用专门的链路层的协议。

传送数据时,数据链路层将数据报文组装成帧传输,每一帧包括数据和必要的控制信息(如:同步信息,地址信息,差错控制等)。

在接收数据时,控制信息使接收端可以知道一个帧从哪一个比特开始和到哪一个比特结束。
数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。

控制信息还使接收端可以检测到所收到的帧中有无差错。若是发现差错,数据链路层就简单地丢弃这个出了差错的帧,避免浪费网络资源。

若是须要改正数据在链路层传输时出现差错(这就是说,数据链路层不只要检错,并且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。

物理层

在物理层上所传送的数据单位是比特。
物理层是实现相邻节点之间比特流的透明传送,尽量屏蔽物理设备的差别。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化

TCP 三次握手和四次挥手

图片描述

TCP 三次握手 - 创建一个链接:

  • 客户端–发送带有 SYN 标志的数据包给服务端 - 一次握手
  • 服务端–发送带有 SYN/ACK 标志的数据包给客户端 – 二次握手
  • 客户端–发送带有带有 ACK 标志的数据包给服务端 – 三次握手

什么是半链接队列?

服务器第一次收到客户端的 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(Initial Sequence Number)是固定的吗?

ISN随时间而变化,所以每一个链接都将具备不一样的ISN。ISN能够看做是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在之后又被传送,而致使某个链接的一方对它作错误的解释。 三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。若是 ISN 是固定的,攻击者很容易猜出后续的确认号,所以 ISN 是动态生成的。

三次握手过程当中能够携带数据吗?

第一次、第二次握手不能够携带数据.第三次握手的时候,是能够携带数据的。 由于第一次握手能够携带数据的话,若是有人要恶意攻击服务器,那他重复在第一次握手中的 SYN 报文中放入大量的数据,这会让服务器花费不少时间、内存空间来接收这些报文。

简单的缘由就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来讲已经创建起链接了,而且也已经知道服务器的接收、发送能力是正常,能携带数据也没啥毛病

为何要三次握手

三次握手的目的是创建可靠的通讯信道,说到通信,简单来讲就是数据的发送与接收,而三次握手最主要的目的就是双方确认本身与对方的发送与接收是正常的。

  • 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
  • 第二次握手:Client 确认了:本身发送、接收正常,对方发送、接收正常;Server 确认了:本身接收正常,对方发送正常
  • 第三次握手:Client 确认了:本身发送、接收正常,对方发送、接收正常;Server 确认了:本身发送、接收正常,对方发送接收正常

因此三次握手就能确认双发收发功能都正常,缺一不可。

为何要传回 SYN

接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。

传了 SYN,为啥还要传 ACK

双方通讯无误必须是二者互相发送信息都无误。传了 SYN,证实发送方到接收方的通道没有问题,可是接收方到发送方的通道还须要 ACK 信号来进行验证。

为何不须要四次握手 -

彻底可靠的通讯协议是不存在的。在通过三次握手以后,客户端和服务端已经能够确认以前的通讯情况,都收到了确认信息。因此即使再增长握手次数也不能保证后面的通讯彻底可靠,因此是没有必要的。

TCP 四次挥手 - 断开一个链接:

  • 客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送
  • 服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 同样,一个 FIN 将占用一个序号
  • 服务器-关闭与客户端的链接,发送一个FIN给客户端
  • 客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1

为何要四次挥手

ACK报文是用来应答的,SYN报文是用来同步的。 当服务端收到FIN报文时,并不会当即关闭SOCKET,只能先回复一个ACK报文,告诉客户端,"你发的FIN报文我收到了"。只有等到我服务端全部的报文都发送完了,我才能发送FIN报文,所以不能一块儿发送。故须要四次挥手。

2MSL等待状态
TIME_WAIT状态也成为2MSL等待状态。每一个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,由于TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。

四次挥手释放链接时,等待2MSL的意义?

为了保证客户端发送的最后一个ACK报文段可以到达服务器。由于这个ACK有可能丢失,从而致使处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,从新启动时间等待计时器。最后客户端和服务器都能正常的关闭。

假设客户端不等待2MSL,而是在发送完ACK以后直接释放关闭,一但这个ACK丢失的话,服务器就没法正常的进入关闭链接状态。

为何TIME_WAIT状态须要通过2MSL才能返回到CLOSE状态?

理论上,四个报文都发送完毕,就能够直接进入CLOSE状态了,可是可能网络是不可靠的,有可能最后一个ACK丢失。因此TIME_WAIT状态就是用来重发可能丢失的ACK报文。

相关文章
相关标签/搜索