TCP/UDP的小事情
UDP:
没有复杂的控制机制,面向无连接的通信服务。
常用于:
包总量少的通信
音视频传输(即时通信)
TCP:
对传输、发送、通信、进行控制的协议。面向有连接的协议,只有在确认通信对端存在时才会发送数据,UDP是对端不存在也会发送。
通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠的传输。
① 通过序列号和确认应答提高TCP的可靠性
- 确认应答(ACK):当发送端数据达到接收主机时,接受主机会返回一个已收到消息的通知,这就是ACK。如果发送端没有收到确认应答,就会进行重发。
- 序列号:按顺序给发送数据标上号码的编号,接收端查询接收数据TCP首部中的序列号和数据长度,将自己下一步应该接受的序号作为确认应答返送回去。
- 接收端会根据序列号的判断需要接受数据。
- 通过序列号可以避免接受端收到数据,确认应答没有返给发送端,导致发送端一直重发数据的情况。
② 重发超时如何确定
- 重发超时是指在重发数据之前,等待确认应答到来的那个特定的时间间隔。如果超过这个时间还没有收到确认应答,发送端就会进行重新发送数据。
- 那么这个时间如何确定呢?根据不同网络波段拥堵情况不一样,需要计算每次发包的往返时间及其偏差。
③ 连接管理
- 使用TCP的首部字段进行管理TCP连接,一次连接与断开至少需要七次来回发包。
④ TCP以段来发送数据
- 在建立TCP的连接时,也可以确定发送数据包的单位,我们称其为最大消息长度MSS。最理想的情况是MSS正好是IP中不会被分片处理的最大数据。
- MSS是在三次握手时计算出来的,两端的主机发送连接请求时,会在TCP首部中写入MSS,告诉对方自己适应的尺寸,然后选择一个较小的值投入使用。
⑤ 利用窗口控制提高速度
- TCP以1个段为单位,每发一个段进行一次应答处理,这样处理有一个缺点,那就是包的往返时间越长通信性能就越低。为了解决这个问题,TCP就引入了窗口的概念。
- 窗口的大小是指无需确认应答而可以继续发送数据的最大值,如图,窗口大小为4个段。
⑥ 窗口控制与重发控制
- 连续三次收到同一个应答,会对其重发,高速重发精致。
⑦ 流控制
- 这种机制可以让发送端根据接受端的实际接受能力控制发送的数量。
- TCP首部中,专门有一个字段用来通知窗口大小。
- 接收端向发送端主机通知自己可以接受数据的大小,于是发送端会发送不超过这个限度的数据。
⑧ 拥塞控制
- 在通信一开始的时候,会有一个慢启动的算法的出的值,对发送数据量进行控制。避免通信开始时连续发包导致的网络拥堵。
TCP结构
TCP中没有表示包长度和数据长度的字段,可由IP层获知TCP的包长,有TCP的包长可获知数据的长度。
源端口号:
表示发送端端口号,字段长16位。
目标端口号:
表示接收端端口号,字段长16位。
序列号:
字段长32位,序列号是指发送数据所在的位置。每发送一次数据,就累加一次该数据的字节数的大小。
序列号不会从0或者1 开始,而是建立连接时由计算机产生的随机数作为初始值,通过SYN包传给接收端主机,然后再由每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然本身不携带数据,但是也会作为一个字节增加对应的序列号。
确认应答号:
确认应答号字段长度为32位,是指下一次应该收到的数据的序列号。实际上,它是指已收到的确认应答减一为值得数据。发送端在收到这个确认应答以后可以认为在这个序号之前的数据都已经被正常接收到了。
数据偏移:
该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看做是TCP首部的长度。该字段长4位,单位字节4字节即32位。如果该字段的值为5,那说明从TCP包的最一开始到20字节位置都是TCP首部,余下部分是TCP数据。
保留
该字段主要是为了以后扩展使用,一般设置为0,但即使收到的包中该字段不为0,也不会丢弃。
控制位
每一位从左至右分别为CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。
- CWR:CWR标志与后面的ECE标志,都用于IP首部的ECN字段,ECE的标志位1时,则通知对方已将阻塞窗口缩小。
- ECE:ECE标志,置为1时会通知对方,从对方到这边的网络有阻塞。在收到数据包IP首部中ECN为1时将TCP首部中ECE设置为1,
- URG:该位为1时,表示包中有需要紧急处理的数据。对于需要紧急处理的数据,会在后面的紧急指针中在进行解释。
- ACK:该位为1时,确认应答有效,TCP规定除了最初建立连接时的SYN包之外该位必须设置为1。
- PSH:该位为1时,表示需要将受到的数据立刻传给上层应用协议,为0时,则不需要穿而是先进行缓存。
- RST:该位为1时,表示TCP连接中出现异常必须强制断开连接。
- SYN:用于建立连接。SYN为1时表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。
- FIN:该位为1时,表示今后不会再有数据发送,希望断开连接,当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段,每个主机又对对方的FIN包进行确认应答以后就可以断开连接。不过,主机收到FIN设置为1 时的TCP段,以后不必马上回复一个FIN包,而是等到缓冲区中所有的数据都因成功发送而被自动删除后在发送确认应答。
窗口大小
该字段长为16,用于通知从相同TCP首部的确认应答号所指位置开始能够接受数据大小,TCP不允许发送超过此处所示大小的数据。如果窗口大小为0,表示窗口探测,以了解最新的窗口大小。
校验和
同UDP
紧急指针
本报文中的紧急数据的指针。
选项
提高TCP的性能。
UDP结构
除去数据部分正是UDP的首部,UDP首部由源端口号、目标端口号、包长、校验和组成。
包长度
该字段保存了UDP首部的长度跟数据的长度之和。
校验和
校验和是为了提供可靠的UDP首部和数据而设计。