系列文章:
01-计算机网络的体系结构
02-IP网络层
03-TCP和UDP的基本认识
04-TCP三握四挥
05-TCP的重传机制
06-TCP的流量控制,拥塞控制
07-Http的基础知识
08-HTTPS与加密
09-其它
参考文章:
小林coding:近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
一. TCP 头格式
序列号:建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。
控制位:
- ACK:该位为
1
时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的SYN
包之外该位必须设置为1
。 - RST:该位为
1
时,表示 TCP 连接中出现异常必须强制断开连接。 - SYC:该位为
1
时,表示希望建立连,并在其「序列号」的字段进行序列号初始值的设定。 - FIN:该位为
1
时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN
位置为 1 的 TCP 段。
二.UDP的头部格式
UDP 协议真的非常简,头部只有 8
个字节( 64 位)。
目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程。
包长度:该字段保存了 UDP 首部的长度跟数据的长度之和。
校验和:校验和是为了提供可靠的 UDP 首部和数据而设计。
三. TCP的特点
- TCP 提供一种面向连接的、可靠的字节流服务
- 在一个 TCP 连接中,仅有两方进行彼此通信。TCP不能用于广播和多播
- TCP 使用校验和,确认和重传机制来保证可靠传输
- TCP 给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复
- TCP 使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制
四. UDP的特点
UDP 是一个简单的传输层协议。和 TCP 相比,UDP 有下面几个显著特性:
- UDP 缺乏可靠性。UDP 本身不提供确认,序列号,超时重传等机制。UDP 数据报可能在网络中被复制,被重新排序。即 UDP 不保证数据报会到达其最终目的地,也不保证各个数据报的先后顺序,也不保证每个数据报只到达一次
- UDP 数据报是有长度的。每个 UDP 数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收方。而 TCP 是一个字节流协议,没有任何(协议上的)记录边界。
- UDP 是无连接的。UDP 客户和服务器之前不必存在长期的关系。UDP 发送数据报之前也不需要经过握手创建连接的过程。
- UDP 支持多播和广播。
五. TCP和UDP的区别
1. 连接
- TCP 是面向连接的传输层协议,传输数据前先要建立连接。
- UDP 是不需要连接,即刻传输数据。
2. 服务对象
- TCP 是一对一的两点服务,即一条连接只有两个端点。
- UDP 支持一对一、一对多、多对多的交互通信
3. 可靠性
- TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
- UDP 是尽最大努力交付,不保证可靠交付数据。
4. 拥塞控制、流量控制
- TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
- UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
5. 首部开销
- TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是
20
个字节,如果使用了「选项」字段则会变长的。 - UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
6. 数据报大小
- TCP:由于 TCP 是建立在两端连接之上的协议,所以理论上发送的数据流不存在大小的限制。但是由于缓冲区有大小限制,所以你如果用 TCP 发送一段很大的数据,可能会截断成好几段,接收方依次的接收。
- UDP:由于 UDP 本身发送的就是一份一份的数据报,所以自然而然的就有一个上限的大小。
7. TCP面向字节流,UDP面向数据报
六. TCP 和 UDP 应用场景:
由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
FTP
文件传输HTTP
/HTTPS
由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
- 包总量较少的通信,如
DNS
、SNMP
等 - 视频、音频等多媒体通信
- 广播通信
七. 什么是 TCP 连接?
简单来说就是,用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。
所以我们可以知道,建立一个 TCP 连接是需要客户端与服务器端达成上述三个信息的共识。
-
Socket:由 IP 地址和端口号组成
-
序列号:用来解决乱序问题等
-
窗口大小:用来做流量控制
八. 既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?
分片-MTU(Maximum Transmission Unit,最大传输单元)
首先说一下MTU的概念。MTU是指数据链路层会对数据帧的大小有一个限制,这个限制就叫做MTU。
如果说IP层有一个数据要传,而这个数据的大小超出了MTU,那么IP层就会根据MTU将这个数据进行分片,然后一片一片的进行传输。
接收方接收到这些数据片之后,就会由接收方的IP层进行重装,形成一整个数据。
使用UDP很容易导致分片,而使用TCP一般会避免分片,这是因为TCP有自己的分段方式。
网络通信,尽一切可能避免IP的分片!为什么?
-
如果一个 IP 分片丢失,整个 IP 报文的所有分片都得重传。效率低下,浪费资源。
-
负责IP分片的那台主机、路由器会花费很多CPU资源来处理分片,同时对应的接受端也需要花费很多资源来进行重组。
分段-MSS(Maxitum Segment Size,最大分段大小)
这个是TCP中的概念,指TCP数据包每次能够传输的最大数据分段,这个是根据当前网络的传输速率以及传输容量来定义的。在每次TCP传输前,发送方和接收方都会根据情况商定一个MSS,然后发送方就会将一整个数据流根据MSS分成多段,然后一段一段的传输。
总结:UDP不会分段,那就又IP来分片;TCP会自行分段,那么就不需要IP来分片了。
九.TCP是如何保证可靠传输的
TCP主要提供了检验和、序列号/确认应答、重传机制、最大消息长度、滑动窗口与累计确认,拥塞控制等方法实现了可靠性传输。
检验和
通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送。(TCP在计算检验和时,会在TCP首部加上一个12字节的伪首部。检验和总共计算3部分:TCP首部、TCP数据、TCP伪首部。)
序列号/确认应答机制
TCP在发送数据时,每发送一次数据,就会在序列号中对数据做记录并连同数据发给对端,接收端在收到后,返回对应的ACK响应包。如果没有收到相应包,就会重传数据。
重传机制
TCP中设有超时重传,快速重传等多种重传机制。当发送端在超过指定的时间后,还没有收到对方的 ACK
确认应答报文,就会重发该数据。当收到三个相同的ACK响应时,也会重发数据。从而保证数据的完整性。
最大消息长度
为了防止数据过大被IP层分片,从而增大数据在IP层丢失的可能性。在建立TCP连接的时候,双方约定一个最大的长度(MSS)作为发送的单位,重传的时候也是以这个单位来进行重传。理想的情况下是该长度的数据刚好不被网络层分块。
滑动窗口与累计确认
为了增大效率,提高网络的吞吐量,使用了滑动窗口协议。一次可以发送多个数据包而无需应答。并且使用累计确认保证了数据的可靠性。
比如连续发送了 100199,200299,300~399三个数据包,接收端都接收到了,并返回对应的ACK给发送端。如果ACK 300 在发送时丢失了,但是接收到了ACK 400,此时就可以通过接收到的ACk 400 来确认200~299的数据已经被接收到了。实际上,只要接收到了ACK 400,就可以认为他前面的所有数据都接收到了,这就是累计确认。
拥塞控制
当网络出现拥堵或者刚建立连接时,数据传输的可靠性可能会降低,重传的记录会增加。TCP通过拥塞控制在此时减少数据包的发送,等到网络状况比较稳定后再发送更多的数据。