乐趣区

关于linux:tcp-udp详解

TCP 报头

(1)TCP 协定报头
TCP 指传输控制协议,其报头格局如下:

1)源 / 目标端口号:示意数据是从哪个过程来,到哪个过程去。
2)32 位序号 /32 确认号:用于牢靠传输。
3)4 位 TCP 报头长度:示意该 TCP 头部有多少个 32 位 bit(有多少个 4 字节),所以 TCP 头部最大长度是 15*4=60。
4)6 位标记位:TCP 协定中的六个标记别离是,URG、ACK、PSH、RST、SYN、FIN。
A、UGR(紧急):UGR= 1 示意紧急指针字段无效。它通知零碎此报文段有紧急数据,该当尽快传送。从报文段的结尾,到紧急指针指向的中央就是紧急数据。
B、ACK(确认):ACK= 1 时,确认号字段才无效。
C、PSH(推送): 让对方立刻收到响应。与 URG 的区别就是 URG 中的紧急数据不通过缓冲区就间接上交给下层逻辑,而 PSH 还是要从缓冲区上交,只是不必等到缓冲区满了才上交。
D、RST(复位):RST= 1 时,表明 TCP 链接中呈现重大过错,必须开释链接,而后再从新链接。以下几种场景中会应用 RST 报文(拜访不存在的端口。异样终止一个链接,个别状况下是发送 FIN,因为在所有排队数据都以发送之后才发送 FIN,然而也有可能发送一个 RST 来异样开释连贯。检测半关上的链接,即一端敞开,另一端不晓得,这时会发送一个 RST 进行监测。当长时间不必连贯,连贯断开之后,再次拜访的时候会发送 RST)。
E、SYN(同步): 在链接建设时用来同步序号。当 SYN=1,ACK= 0 时示意申请报文。SYN=1,ACK= 1 示意链接承受。因而 SYN= 1 示意一个链接申请或链接承受报文。
F、FIN(终止): 用来开释一个链接。
5)16 位窗口大小:示意数据传输的最大长度。
6)16 位校验和:发送端填充,CRC 测验,接收端校验不通过,则认为数据有问题。此处的校验和不光蕴含 TCP 首部,也蕴含 TCP 数据局部。
7)16 紧急指针:标识哪局部数据是紧急数据。
8)40 字节头部选项:寄存一个窗口扩充因子等等信息。
tcp_time_wait_linux 详解
tcp connection 是如何建设的
tcp flags

(2)UDP 协定报头
UDP 指用户数据报协定,其报头格局如下:

TCP 的优缺点

(1)TCP 的长处:
TCP 的长处是:牢靠、稳固。它体现在 TCP 在传递数据之前,会有三次握手来建设连贯;在数据传递时,采纳校验和、序列号、确认应答、超时重发、流量管制、拥塞管制,为了进步性能,还采纳了滑动窗口、提早应答和捎带应答等机制;在数据传完后,会断开连接以节约系统资源。

(2)TCP 的毛病:
TCP 的毛病:运行速度慢,效率低,占用系统资源多,易被攻 ji。因为 TCP 在传递数据之前,要先建设连贯,这会耗费工夫;在数据传递时,确认机制、重传机制、拥塞管制机制等都会耗费大量的工夫,而且要在每台设施上保护所有的传输连贯,每个连贯都会占用零碎的 CPU、内存等资源;TCP 有确认机制、三次握手机制,这导致 TCP 容易受到 DOS、DDOS、CC 等攻 ji。收到 STN 洪水攻 ji,是因为应用 TCP 的时候服务器端须要 listen,这时须要设置 backlog。

UDP 的优缺点

(1)UDP 的长处:运行速度较快,比 TCP 平安。
1)运行速度快,因为 UDP 连贯没有 TCP 的三次握手、确认应答、超时重发、流量管制、拥塞管制等机制,而且 UDP 是一个无状态的传输协定,所以它在传递数据时十分快。
2)较平安,因为没有 TCP 的那些机制,UDP 较 TCP 被攻 ji 者利用的漏 dong 就会少一些。但 UDP 也是无奈防止攻 ji 的,比方:UDP Flood 攻 ji 等。
(2)UDP 的毛病:不牢靠,不稳固。
因为 UDP 没有 TCP 那些牢靠的机制,在数据传递时,如果网络品质不好,就会很容易丢包。

how tcp connection works

TCP 和 UDP 的特点

(1)TCP 的特点
TCP 协定是一种有连贯、牢靠的、面向字节流、绝对比较慢、点对点的传输层协定。TCP 协定实用于对可靠性要求比拟高的场合。
(2)UDP 的特点
UDP 协定是一种无连贯,不牢靠、面向数据报、速度比拟快、可实现一对一,多对一的传输层协定。UDP 协定实用于对实时性有要求的场合。因为 UDP 不保障可靠性,所以 UDP 也没有重传机制,也没有拥塞机制,它只是尽最大致力交付数据。

TCP 保证数据可靠性和进步性能的机制

(1)确认应答(ACK)机制
TCP 将每个字节的数据都进行了编号,即为序列号。每一个 ACK 都带有对应的确认序列号,意思是通知发送者收到了哪些数据,下次从哪里开始发送。

(2)超时重传机制
1)超时重传机制的工作过程
主机 A 发送数据给 B 之后,可能因为网络拥挤等问题,数据无奈达到主机 B。如果主机 A 在一个特定工夫距离内没有收到 B 发来的确认应答,就会进行重发。然而,主机 A 未收到 B 发来的确认应答,也可能是因为 ACK 失落了,因而主机 B 会收到很多反复数据。那么 TCP 协定须要可能辨认出哪些包是反复的,并且把反复的抛弃掉,这时候能够利用序列号就能够很容易做到去重的成果。
2)如何确定超时工夫?
最现实的状况下找到一个最小的工夫,保障“确认应答”肯定能在这个工夫内返回。然而,这个工夫的长短随着网络环境的不同是有差别的,如果超时工夫设的太长会影响整体的重传效率;如果超时工夫设得太短,有可能会频繁发送反复的包。
TCP 为了保障无论在任何环境下都能比拟高性能的通信,因而会动静计算这个最大超时工夫。Linux 中超时以 500ms 为一个单位进行管制,每次断定超时重发的超时工夫都是 500ms 的整数倍。如果重发一次之后依然得不到应答,期待 2500ms 后进行重传;如果依然得不到应答,期待 4500ms 再进行重传,以此类推,以指数模式递增。累计到肯定的重传次数,TCP 认为网络或者对端主机出现异常,并强制敞开连贯。

(3)滑动窗口
1)为什么须要滑动窗口?
后面探讨了确认应答策略,对每一个发送的数据段都要给一个 ACK 确认应答,收到 ACK 后再发送下一个数据段。这个做有一个比拟大的毛病就是性能较差,尤其是数据往返的工夫较长的时候。既然这样一发一收性能较低,那么如果一次发送多条数据,不是就能够将多个段的期待时间重叠在一起进步性能了吗?
2)工作过程
窗口大小指的是毋庸期待确认应答而能够持续发送数据的最大值,规定发送前 4 个段的时候,须要期待任何 ACK 间接发送。收到第一个 ACK 后,滑动窗口向后挪动,持续发送第 5 个段的数据,以此类推。操作系统内核为了保护这个滑动窗口,须要开拓发送缓冲区来记录以后还有哪些数据没有应答,只有确认应答过的数据能力从缓冲区删掉,窗口越大网络吞吐率就越高。那么如果呈现丢包,如何进行重传?
状况一:数据包曾经到达,ACK 被丢了。
这种状况下,局部 ACK 丢了并不要紧,因为能够通过后续的 ACK 进行确认。
状况二:数据包间接丢了。
当某一段报文失落之后,发送端会始终收到 1001 这样的 ACK,就像是在揭示发送端“接收端想要的就是 1001”一样。如果发送端主机间断三次收到了同样一个“1001”,就会将对应的数据 1001-2000 从新发送. 这个时候接收端收到了 1001 之后,再次返回的 ACK 就是 7001 了,因为 2001-7000 接收端其实之前就曾经收到了,被放到了接收端操作系统内核的接收缓冲区中。这种机制被称为“高速重发管制”,也称为“快重传”。
tcp_window_scaling

(4)流量管制
1)什么是流量管制?
接收端解决数据的速度是无限的,如果发送端发得太快,导致接收端的缓冲区被填满,这个时候如果发送端持续发送就会造成丢包,继而引起丢包重传等等一系列连锁反应。因而,TCP 反对依据接收端的解决能力来决定发送端的发送速度,这个机制就叫做流量管制。
2)工作流程
接收端将本人能够接管的缓冲区大小放入 TCP 首部中的“窗口大小”字段,通过 ACK 端告诉发送端。窗口大小字段越大,阐明网络的吞吐量越高。接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值告诉给发送端,发送端接管到这个窗口之后就会减慢本人的发送速度。如果接收端缓冲区满了就会将窗口置为 0,这时发送方不再发送数据,然而须要定期发送一个窗口探测数据段,使接收端把窗口大小通知发送端。
3)接收端如何把窗口大小通知发送端?
在 TCP 首部中,有一个 16 位窗口字段就是用于寄存窗口信息的。16 位数字最大示意 65535,那么 TCP 窗口最大就是 65535 字节么?实际上,TCP 首部 40 字节选项中还蕴含了一个窗口扩充因子 M,理论窗口大小是窗口字段的值左移 M 位。

(5)拥塞管制
1) 拥塞管制的必要性
尽管 TCP 有了滑动窗口这个大杀器,可能高效牢靠的发送大量数据,然而如果在刚开始阶段就发送大量的数据,依然可能引发问题。因为网络上有很多的计算机,可能以后的网络状态就曾经比拟拥挤,在不分明以后网络状态下贸然发送大量的数据,是很有可能雪上加霜的。
2)慢启动
TCP 引入慢启动机制,先发大量的数据探探路,摸清以后的网络拥挤状态再决定依照多大的速度传输数据。此处引入一个概念——拥塞窗口,发送开始的时候,定义拥塞窗口大小为 1。每次收到一个 ACK 应答拥塞窗口就加 1,每次发送数据包的时候将拥塞窗口和接收端主机反馈的窗口大小做比拟,取较小的值作为理论发送的窗口。
3)慢启动阀值
像下面这样的拥塞窗口增长速度是指数级别的。“慢启动”只是指初始时慢,然而增长速度十分快。为了不增长得那么快,因而不能应用拥塞窗口单纯的加倍。此处引入一个叫做慢启动的阀值,当拥塞窗口超过这个阀值的时候,不再依照指数形式增长,而是依照线性形式增长。当 TCP 开始启动的时候,慢启动阀值等于窗口最大值,在每次超时重发的时候,慢启动阀值会变成原来的一半,同时拥塞窗口置回 1。大量的丢包仅仅是触发超时重传,大量的丢包就会认为是网络拥塞。当 TCP 通信开始后,网络吞吐量会逐步回升,随着网络产生拥挤,吞吐量会立即降落。拥塞管制。归根结底是 TCP 协定想尽可能快的把数据传输给对方,然而又要防止给网络造成太大的压力的折中计划。(TCP 拥塞管制这样的过程就如同热恋的感觉)

(6)提早应答
如果接收端数据的主机立即返回 ACK 应答,这个时候返回的窗口可能性比拟小。假如接收端缓冲区为 1M, 一次收到了 500k 的数据,如果立即应答,返回的窗口就是 500k。然而实际上可能解决端解决的速度很快,10ms 之内就把 500k 数据从缓冲区生产掉。在这种状况下,接收端解决还远没有达到本人的极限,即便窗口再放大一些,也能解决过去。如果接收端略微等一会儿再应答,比方期待 200ms 再应答,那么这个时候返回的窗口大小就是 1M。留神:窗口越大,网络吞吐量就越大,传输效率就越高,应在保障网络不拥塞的状况下尽量进步传输效率。那么,所有的包都能够提早应答么?必定不行,因为规定有数量限度,每隔 N 个包就应答一次;而且有工夫限度,超过最大延迟时间就应答一次,具体的数量和工夫依操作系统不同也有差别,个别 N 取 2,超时工夫取 200ms。

(7)捎带应答
在提早应答的根底上,很多状况下客户端服务器在应用层也是“一发一收”的,意味着客户端给服务器说了“how are you”,服务器也会给客户端会一个“Fine,thank 有”,那么这个时候 ACK 就能够搭逆风车和服务器回应的“Fine,thank you”一起回给客户端。

更多详情:
tcp vs udp

退出移动版