你有可能在玩我的世界或在nas使用时会跳出"tcp"的字样,那tcp是什么?他有什么特点?他和udp有什么区别,还有哪些协议和互联网知识与tcp有关呢?

我将以TCP为切入,补齐网络知识第一课。


TCP/IP

这里的TCP并不是指TCP协议,而是TCP/IP分层模型,它是为了方便不同设备之间互相通信的一种分层的概念,是互联网的核心基础语言,并非单一协议,而是一组协议套件,而TCP协议就是传输层中主要的协议,TCP提供面向连接、可靠的字节流服务,而UDP则为用户提供简洁、面向数据报的服务。 TCP/IP 分层模型

那传输层有什么作用呢?

如果你有一定网络基础,你应该知道使用网络应用或服务,就需要知道服务的对应服务器的IP,相应返回的数据也会返回到你所在的IP,那么现在有一个问题,数据找到你的IP,到达设备之后,怎么知道这是设备上哪个运行的应用服务的数据呢? 传输层的作用就是实现端到端的服务,设备上的应用会使用端口(port)来定位唯一的服务。 端口范围:0-65535
知名端口:0-1023 随机端口:1024-65535 TCP:http「80」,https「443」,ssh「22」, FTP「20/21」。。。。。 UDP:DNS服务「53」 DHCP「67/68」。。。。。

了解完这些基础知识之后,我们真正来了解TCP协议,我会结合UDP协议,对比了解TCP协议的各种。


TCP协议

TCP协议:传输控制协议——面向连接的协议 UDP协议:用户数据包协议——面向无连接的协议

那什么是面向连接或无连接的协议呢?简单来说,TCP协议会在传输任务之前建立一条虚拟的连接,向要连接的对象发送连接请求,需要有一个连接请求的流程。而无连接的协议,就是不会向要连接的对象发送连接请求,而直接进行传输,有可能数据到不了,有可能中间会丢包,这就是UDP协议。所以说,TCP协议是可靠的协议,而UDP协议是一个不可靠的协议。TCP 适用于单播通信,可以建立良好的连接,灵活地对接下来的数据进行传递控制,而UDP无法对于传递的数据进行控制,只能借用应用层来实现。

那为什么一开始就不使用TCP协议呢?

因为TCP协议也有缺点,它无法满足及时性的连接需求,而UDP就可以很好地满足及时性的要求,应用于那些对时间要求比较高的服务比如游戏,所以两者并不是优劣之分,而是需求选择。

再多说一句,TCP协议可以将网络传输的数据进行分片,灵活地控制传输的流量大小,但是UDP协议不可以。


报文

接下来我们来了解一个基础的知识:报文

网络报文(Message/Packet)是网络通信中传输和交换的基本数据单元,包含了要发送的完整信息。在网络传输过程中,它会被逐层封装,在不同协议层有不同叫法(如在应用层叫"报文",传输层叫"段",网络层叫"数据包",数据链路层叫"帧")。 在后面的文章中,我们会了解各种协议,各种网络层的报文。

那我们来看一下TCP的报文结构 TCP 报文结构

我们会详细介绍 Acknowledge Number和置位,因为它和TCP的重要功能三次握手有关。

当下方的小大写字母 ACK 取 1 的时候,Acknowledge Number才有意义,接下来我会结合报文,来介绍,TCP 建立连接,传输,和关闭连接的过程


TCP建立连接的过程(三次握手)

TCP 三次握手

首先,TCP建立连接完毕之前是不会传递数据的,因为它是一个全双工的协议,既可以收数据,也可以发数据。所以建立连接之前会进行3次握手。接下来详细介绍3次握手。

3次握手

1,首先,客户端会向主机发送一个SYN置位为1的数据报文,SYN代表同步位,表示客户端想向服务端建立连接,与此同时,会有一个发送随机seq=a的序列号(用来保证客户端报文数据的唯一)。第一步的整体意思就是,一个唯一的客户端向服务端进行一次连接请求。 2,接下来服务端就会回复,回复时也会把SYN置为1,代表服务端也想和客户端建立连接,发送第二条报文的时候,也会发送一个随机的序列号seq=b(用来确定服务端发回的报文数据的唯一),接下来又跟着一个 ack=a+1(ACK代表确认位,他把第一步发送的随机数加1,客户端接收到这个报文的时候,会将确认为-1已确认是否是第一条报文的回复)所以表示我已经收到第一条报文。后面跟了个SYN表示服务端也想建立连接 ,所以第二步的整体意思是,服务端已经收到报文了,服务端也要和客户端建立连接,并且将证明这是第一条报文的下一条报文。 3,在进行完前两步后,就已经表示服务端和客户端的网络连接是通的,这时候客户端就会向服务端发送最后一次确客户端收到了服务端发送的连接请求。这时候seq=a+1,表示现在是接着第二条报文发送的第三条报文(这里的序列号就用对方的确认号生成)表示连接建立,接着发送确认号ack=b+1,在第三步最后只发送一个确认ACK,用来确认服务端向客户端发送的连接请求是被接收的。

这里说一个弦外的,当客户端每次向服务端发送一个SYN同步,服务端就要记住其序号,并且生成自己需要记住的序号,也就是生成随机的seq=b,这时候服务器就会占用大量的资源用来生成随机数,就会导致服务器崩溃,这就是典型的ddos攻击,因此,现代的防DDoS攻击,为了避免这个情况,它的序列号是通过服务器的 IP 地址和端口号等私有信息,进行算法运算得到的,以减轻生成随机数带来的负载压力。


TCP传输过程

TCP 传输过程

TCP会将每个报文分成标准的500大小,在这张图中,客户端向服务端推送1500的流量,每段就是500,当服务端收到数据之后,会将序列号(传输的最大值)+1用来确认(M为起始值)。当有一段数据段没有收到的时候,服务端会将收到的数据段进行重组,这时候会重新发送确认号 M+1500,意思是从 1500 开始发,代表的意思是,如果有一个数据段丢失,服务端将会请求重新全部发送,服务端会将接收到的数据进行缓存,等它再次全部接收数据之后,会将缺失的部分补充,这就是TCP的重传机制

在TCP传输过程中,如果客户端向服务端发送数据,发送数据之后,服务端并没有返回,客户端会在一定时间之后重新向服务端发送数据。这个机制叫超时重传机制,时间的算法为RTTS加权的平均往返时间,所以在 TCP 传输过程中,只要 3 次握手之后建立好连接,数据在传输过程中没有得到回复,依旧重新传输。这保证了TCP在传输过程中的可靠和稳定。

TCP的确认机制

1,三次握手中, ack=对方的 seq+1 2,数据传输时,ack=对方所传递的数据的最大值+1


TCP的流量控制

TCP 的流量控制回到报文当中,查看报文当中的 window 字段。在C/S架构当中(客户端和服务端架构)服务器会接受和发送多条数据,所以单台服务器对于处理数据是有限的,所以就要对数据的发送长度进行管控。在网络封装中传输层和应用层整体的数据大小最大为1500mtu,除去IP头和TCP头,所以,以 TCP 为传输协议的传输数据,数据最大为 1460 MTU(Maximum segment size最大报文段长度),即使用TCP封装时应用层传输的最大长度为1460mtu。在传输时,本地会将数据划分成一个一个的分片,并缓存到本地。

滑动窗口协议

服务端的缓存区大小有限。如果缓存区满,服务端会将超出缓存区的数据丢弃,在下面这张图中,主机A向服务端发送了4条数据,第4条数据被服务端丢弃,服务端向它返回,确认值ack为3,意思是012数据段已收到,下次发送数据时请从第三段数据开始发送。这个时候,TCP报文当中的window将会变成3,如果服务端接收到的数据超出了缓冲区,那么它将会自动变化 Window 的数值。

滑动窗口协议


TCP关闭连接(四次挥手)

TCP 四次挥手

发送FIN,代表请求关闭连接,服务端接收之后发送ACK确认,接下来服务端也会发送一个FIN请求关闭连接,最后客户端发送确认,将关闭连接。其中序列号和确认号原理和连接是一样的,序列号为a,则对方发送的确认号为a+1,服务端序列号为b,则收到的确认号就为b+1。主机在关闭连接前要接收到对方的ACK。为什么在客户端向主机端发送关闭请求后,主机端回复后为什么不直接关闭。因为TCP是全双工的,数据是双向的,也需要让客户端确认来自服务端的数据已停止传输。


UDP的传输过程

UDP 传输过程

在UDP的报文头部当中可以进行阉割,可以进行不校验(压缩)最小可以达到6个字节。用UDP传输数据时,由应用程序根据需要提供报文到达确认、排序、流量控制等功能。UDP不提供重传机制,占用资源小,处理效率高。一些时延敏感的流量如语音、视频等,通常用UDP作为传输层协议。


今天学习了TCP协议和UDP协议,还有简单的网络知识,了解了互联网数据处理当中最基本的报文和数据发送前的报文交换,这是互联网数据处理当中最基础的思想概念。