TCP与UDP

179 阅读7分钟

端口即决定是哪个应用程序。

TCP:

面向连接的、可靠的流协议。

TCP为了提供可靠性运输,实行"顺序控制"或"重发控制"机制。此外还有“流(流量)控制”、“拥塞控制”、提高网络利用率等功能。

UDP:

不可靠的数据报协议。

可以确保发送消息的大小,不能保证消息一定会到达。【应用有时会根据自己的需要重发处理】

TCP/UDP区别:

TCP用于在传输层有必要实现可靠传输的情况。它有顺序控制、重发控制,只为了可靠运输。

UDP用于高速传输和实时性较高的通信或者广播通信。

举个例子:

IP电话,如果采用TCP,那么如果有一段包丢失,则会重发,那么就会影响通话正常进行。
但是采用的UDP,那么即使丢包,也只是影响一小段时间的通话,还是可以正常交流的。

PS:多播和广播也使用的是UDP。

名词定义:套接字

使用TCP或UDP时,会广泛使用到套接字(Socket)的API。

应用程序可以利用套接字,设置对端的IP地址、端口号,并实现数据的发送和接收。

端口号

1、数据链路层识别的是不同的计算机。
2、ip地址是用来识别TCP/IP网络中互连的主机和路由器。
3、端口号用来识别同一台计算机中进行通信的不同应用程序。

认为是相同通信的五个标识:

源IP地址、目标地址、协议号、源端口号、目标端口号

目前而言,HTTP通信必须使用TCP协议。

UDP

特点和目的

不提供复杂的控制机制,利用IP提供面向无连接的通信服务。它是将应用程序发来的数据在收到的那一刻,按照原样发送到网络上的一种机制。

即使网络拥堵,也依旧直接发送,什么都不管。

因此常用于一下场景:

*包总量较少的通信(DNS、SNMP等)。
*视频、音频等多媒体通信(即时通信)
*限定于LAN等特定网络中的应用程序
*广播通信(广播、多播)

TCP

特点和目的

特点:

丢包了会重发
对次序乱的分包进行顺序控制
有连接的协议,只有对端存在才会发送数据,避免了流量的浪费。

一句话概括:

TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

TCP工作原理:

如何确认连接成功:

会进行ACK(确认应答)应答。如果返回的是NACK(否认确认应答),则需要重发。

何时需要重发,有一个确定的时间段,到点了如果还没收到就重发。

重发存在的问题:

有可能是网络延迟导致B机器返回应答数据之前,A已经发送了重发数据包。这种情况会导致B机器接收到两次相同的数据包。

问题解决:

对数据进行序列号编码,B机器返回序列号的值,代表下次接收的数据就从这个序列号开始,从而避免了多次接收重复数据的问题。

有一个疑问:

如果B机器在接收到A机器第一次发送的数据之后,返回1001的确认应答号,是返回给A 的过程中呢,时间比较久,导致A又重发了,
请问,如果B到A的过程中丢包,A重发,那么B还能接收到A重发的数据包吗?

因为上面讲到,B为了防止数据重复接收,就针对A的序号+1,且以后只接收+1的数据。

猜测:会不会A重发的数据包的序号会变化,就是自己数据长度+1呀?就是第一次发序号是1,重发的时候序号变成了1001了。

关于重发:

一般都是以0.5s为单位,重发超时都是0.5s的整数倍【最小重发时间至少是1s】一般设置成6s。

如果重发还没有收到,则等待应答时间将会以2倍、4倍的指数函数延长。

但是需要注意的是,当重发次数达到一定界限之后,就不会重发了,认为网络或对端主机发生异常,就会强制断开连接。

连接管理:

一次TCP的连接与断开,需要至少来回发送7个包才能完成。【连接3个,断开4个】
其中建立连接发送3个包,俗称 “三次握手”。断开连接发送4个包,俗称“四次挥手”

关于传输数据大小该怎么确定?

在TCP建立连接的时候,客户端和服务端在发送包的时候会携带一个MSS值(最大消息长度,保证这个值之内不会被分片处理),
这个值是告诉对方自己的接口能够适应的MSS的大小,最后会在两者之间选择一个较小的值投入使用。

引入窗口控制概念:

使用缓冲区,为了就是不使性能下降。说白了,就是一次性发大小4000的数据包,4个包都发。

窗口大小就是指无需等待却确认应答而可以继续发送数据的最大值。如图:

图中的窗口大小就是4000.

窗口控制重点来了:

如果报文丢失,该怎么办?

如果1001-2000这段丢失,那么服务端就会一直返回1001的确认应答,发送端如果在第一次收到该应答后又连续3次收到的都是1001的确认应答,则会重发1001-2000的报文。【所以是4次1001的确认应答】

TCP如何实现流控制?

接收主机会将自己可以接收的缓冲区大小放入这个字段中通知给发送端。就是窗口大小,上面所提到的4000那个值,值越大,网络吞吐量就最高。

不过,如果接收端的缓冲区一旦数据溢出,窗口的大小值就会被设置成一个更小的值通知给发送端,从而控制数据发送量。(发送端完全听接收端的)

需要注意的是:

    如果缓冲区满,发送端等重发超时时间过了之后,会发送一个窗口探测的包,确认窗口大小。如果这个探测包的确认应答丢失,则会一直发
    探测包,直至次数太多导致断开连接。

拥塞控制:

热启动: 拥塞窗口最开始设置为1个数据段(1MSS),之后每接收到一个确认应答就+1,拥塞窗口变大。 在发送数据包的时候,就会将拥塞窗口值和接收端主机通知的窗口大小值做比较,选较小的值,然后发送得时候还要再小一些发送。

UDP首部的格式

重头戏

源端口号:

可有可没有,因为有时候不需要返回通信。不设置的时候该值为0.

目标端口号:

接收端端口,字段长度为16.

包长度:

保存了UDP首部的长度和数据的长度之和。以字节为单位。

校验和:

作用:为了提供可靠的UDP首部和数据而设计。

TCP首部格式

重头戏

校验和:

可以判断协议首部和数据是否被破坏。