本文主要是介绍TCPUDP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
TCP
1.什么是TCP
TCP是处于运输层的通信协议,该协议能够实现数据的可靠性传输。
2.TCP报文格式
源端口和目的端口:各占两个字节,发送进程的端口和接收进程的端口号。
序号:占4个字节,序号如果增加到溢出,则下一个序号从0开始,在TCP传输过程中,传送的每一个字节流都是按顺序编号的。首部中的序号指的是发送数据的第一个字节流的编号。例如当前发送第一个字节流序列号为201,数据部分一共100个字节,那么下一次发送的序号就是301.
确认号:占4字节,期望收到对方下一个报文段数据第一个字节的编号。
数据偏移:占4位,单位是4字节,TCP报文的的首部长度。
保留字段:占6位,保留今后使用。
控制字段6位:
- 第一位URG(紧急标志位):为1时,表示紧急标指针有效,告诉系统此报文为一个紧急数据,应尽快送达。发送的优先级更高。
- 第二位ACK(确认):当为1时,确认号字段有效,ACK为0时,确认号无效,连接建立和确认应答有用。
- 第三位PSH(推送):为1时有效,发送方希望接收方收到推送包,立即将该包交付给上层协议,不要等到缓存区满了在向上交付。
- 第四位RST(复位):为1时有效,表面TCP连接出现严重差错,必须释放连接,重新建立连接.
- 第五位SYN(同步):在连接建立时用来同步序号,当SYN = 1,而ACK = 0时,表面这是一个连接请求报文段,如果接收方同意连接,则应返回SYN = 1和ACK = 1的报文段.
- 第六位FIN(终止):用来释放一个连接,当FIN = 1时,表面此报文段的发送方的数据已经发送完毕,并要求释放连接.
窗口:占2字节,值为[0,2^16-1],指的是发送本报文段的接收窗口大小,如果发送方的确认字段为1000,窗口大小为1000,那么接收方只能发送小于等于1000个字节的数据
校验和:占2字节,检验部分包括首部和数据部分,计算校验和时,要在TCP报文段加上12字节的伪首部.
紧急指针:占2字节,它指出本报文段中紧急数据的字节数(紧急指针接受后就是普通数据),窗口为0也能发送紧急数据,当处理完紧急数据时,TCP告诉应用程序恢复到正常操作.
选项:长度可变,最长40个字节.
总结:TCP的首部的前20个字节是固定的,所以首部最小长度为20字节.
2.TCP实现原理
在古代时期,人们通过写信来互相交流,但是信件的传输渠道并不发达,要保证信件的准确到达更是难上加难,在发信的过程中,如果彼此都认为自己的信是准确到达的,那么我们就可以认为它们互相交流是OK的。如果是你会使用什么办法判断它们互相交流没有问题呢?
举例:A向B发送信件,B接收到了信件,B可以知道A的信息是准确到达的;但是A并不知道它的信息是准确到达的,这时B就像A发送信息,A收到了B的信件,此时A就能认为自己的信是准确到达B的;但是B并不知道它的信息是否准确到达,此时A在向B发送一封信件,B收到信件后就可以自己的信件是准确到达的;此时A、B之间能感知到对方能够正确的接受消息。A,B之间就可以放心大胆的传输数据了。TCP也是如此,为了保证可靠性,首先收发方需要确认彼此都是正常的,才能放心的发送数据,下面看看TCP建立连接的过程吧。
建立连接:
-
客户端向服务器发送SYN报文,其中SYN=1表示建立连接请求,同时将初始序列号seq=x发送给服务器。
-
服务器接收到SYN报文后,向客户端发送SYN+ACK报文,其中SYN=1表示确认建立连接请求,同时也向客户端发送了自己的初始序列号seq=y和ack = x+1。
-
客户端接收到SYN+ACK报文后,向服务器发送ACK报文,其中ACK=1表示确认收到了服务器的确认建立连接请求的报文,并将确认号ack=y+1发送给服务器。此时,TCP连接已经建立。
在TCP三次握手的过程中,客户端和服务器都会发送SYN和ACK报文,以确保双方都能够正常收发数据。通过建立连接前的三次握手,可以保证双方都已经准备好传输数据,从而确保了数据传输的可靠性。
既然有连接,那么就有一个断开的过程,客户端不想在向服务端发送数据了,为了保障资源的利用,客户端向服务端申请断开连接。下面看看TCP是如何断开连接的吧。
断开连接:
-
客户端向服务器发送FIN报文,其中FIN=1表示客户端已经没有数据要发送了。
-
服务器接收到FIN报文后,向客户端发送ACK报文,其中ACK=1表示确认收到了客户端的FIN报文,由系统内核自动回复。
-
服务器向客户端发送FIN报文,其中FIN=1表示服务器已经没有数据要发送了,一般由应用程序触发。
-
客户端接收到FIN报文后,向服务器发送ACK报文,其中ACK=1表示确认收到了服务器的FIN报文。
在TCP断开连接的过程中,每一次挥手都需要等待对方的确认,从而确保双方都已经准备好断开连接。通过断开连接前的四次握手,可以保证双方都已经完成了数据传输,并且都已经准备好断开连接,从而确保了数据传输的可靠性。
注意:断开之前需要保证彼此之间都没有数据需要传输了且双方都同意断开,才是一次完整的断开。
TCP传输细节
TCP通过以下细节来保证数据传输的可靠性
确认应答
对于发送方发送的数据,接收方如果接收到了会向发送反做出反馈表示自己确认收到了。
停止等待
超时重传
发送出数据以后,报文和ACK都由可能丢失,但是发送端并不能确定具体哪个丢失,TCP协议如何处理?
如果不能及时收到一个确认应答,将重发这个报文段。
滑动窗口
客户端和服务端都能作为数据的发送端,如果每一次发送出的数据报都需要等待ACK返回,等待的过程将会耗费比较多的时间,传输效率大打折扣,为了提高传输效率。因此滑动窗口就产生了,那么具体过程是怎么的呢?
举例:假如需要发送10000个比特。分成10次发送。
第一次可以连续发送多个数据包,在连续的发送过程中,可能已经收到了前面数据报的确认应答报文,这时候窗口就可以向后移动,继续发送后面的数据,在这个过程中,窗口一般是持续移动的,因此基本就不需要等待了,提高了传输效率。
ACK丢失:ACK丢失都不是什么大问题,如果接收到了更大的确认序号,接收端也能明白小序号的已经收到了。
数据报丢失:数据报丢失时,ACK返回报文中会持续索要丢包的数据,直到索要成功返回ACK,然后继续索要后续的数据。
流量控制
TCP连接的双方都有一定大小的接收缓存空间,如果一方的发送能力太快,而一方的接收能力特别弱,可能会导致接收弱的一方缓存区溢出,导致数据丢失,那么有必要采用一些手段进行平衡发送和接收速率,TCP协议如何处理?
TCP报文首部有一个窗口参数,仅在ACK报文中生效,表示接收区缓冲区大小,窗口越大,发送速率就越快。当发送方获取到接收缓存区的信息,就会对窗口进行相应调整,来保证自己的发送速率不要过快/慢。如果窗口为0,说明接收缓存区满了,发送端就会停止发送并在一定时刻后发送探测报文,询问接收方缓存区是否有剩余空间。
拥塞控制
数据在互联网中传输过程具有不确定性,和很多的因素有关,因此数据在互联网中传输的速率也需要考虑,如果网络拥塞,导致很多数据丢包了,发送速率和接收速率很快的话,也会影响总体的传输速率,因为可能需要更多的时间对丢包的数据进行重传,那么是如何实现拥塞控制的呢?
通过不断实验的方法:慢启动的方式,开始给定一个比较小的窗口,如何没有出现丢包,逐渐的增大窗口,呈指数增长,到一定程度,呈线性增长,增大到一定程度发现丢包了,重新降到一个比较小的点,重新开始。
延迟应答
在流量控制中,通过ACK报文告诉发送方窗口的大小。当接收方收到了数据,那么这时缓存区也会相应的变小一些,为了回复给发送方ACK报文缓存区大一些,会等待一会时间让缓冲区的信息被应用读取,缓存区就变大了,这时再返回ACK报文窗口就能更大一些,发送方就可以发送更多的数据。
捎带应答
基于延迟应答的一种策略,ACK等待了一小段时间发送,可能这时候也需要发送响应,因此可以将ACK和响应数据一起发送,提高了传输效率。
粘包问题
产生原因:TCP是面向字节流进行传输的,发送方如果发送一个应用层数据包,不会出现什么问题。如果发送方一次发送多个应用层数据包,多个应用层数据包合并到一个TCP报文中发送了,接收方不能正确的判断边界,就容易出现问题。
解决方案:
- 约定好应用层数据包的长度,每个包都有一个固定的长度,不足长度的使用空格方式补齐。
- 每个包的末尾使用固定特殊字符分割,即使被拆分了,接收方也能通过特殊字符对包进行合并。
- 应用层自定义一种协议或使用现有协议,将消息封装例如http协议。
TCP特征
-
可靠性:TCP是一种可靠的传输协议,它提供数据传输的可靠性保证,能够在数据传输过程中检测和纠正传输中的错误,确保数据的完整性和准确性。
-
基于连接:TCP是一种基于连接的协议,它要求在数据传输前先建立连接,然后才能进行数据的传输。这种基于连接的方式可以保证数据传输的可靠性和有序性。
-
面向字节流:TCP是一种面向字节流的协议,它把数据看作是一个连续的字节流,而不是一个个分离的消息。
-
全双工,同时可以接收也能发送数据。
基于TCP的应用层协议
HTTP(超文本传输协议)、SMTP(简单邮件传输协议)、FTP(文件传输协议)、SSH(协议)
UDP
1.什么是UDP
UDP(User Datagram Protocol)是一种无连接的传输层协议,而是简单地将数据报文从一个主机发送到另一个主机。UDP协议是一种轻量级的协议.
-
无连接:UDP是一种无连接的协议,发送数据之前不需要建立连接,也不需要维护连接状态,因此传输效率高。
-
不可靠:UDP不提供可靠的数据传输保证,发送数据时不会进行数据的重传和校验,数据包有可能在传输过程中丢失或者重复。
-
面向报文:UDP将应用程序传递给它的数据报文看作一个整体进行处理,不会进行数据分段和重组操作,因此能够保证数据的完整性。
-
简单快速:UDP的头部较小,没有复杂的连接控制和拥塞控制机制,因此传输速度较快。
-
支持广播和多播:UDP支持广播和多播功能,可以将数据同时发送给多个接收方。
-
适用于实时应用:UDP适用于实时应用,如在线游戏、视频会议等,因为它能够快速地传输数据,但不保证数据的可靠性。
2.UDP数据报格式
- 源端口:2字节需要对方响应时选用,不需要可以全用0
- 目的端口:2字节目的端口号
- 长度:2字节,UDP用户数据报的长度,最小值为8仅有首部。
- 校验和 2字节,检测用户数据报在传输过程中是否有误。有错就丢弃,可选,如果传送的检验和为0,说明发送端没有计算检验和,数据报会被丢弃 。使用CRC(循环冗余算法)。
基于UDP的应用层协议:NFS(网络文件系统)、TFTP(简单文件传输协议)、DHCP(动态主机配置协议)、DNS(域名解析协议)。
这篇关于TCPUDP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!