一、TCP报文:
当一台计算机想要与另一台计算机通讯时,两台计算机之间的通信需要畅通且可靠,这样才能保证正确收发数据。例如,当你想查看网页或查看电子邮件时,希望完整且按顺序查看网页,而不丢失任何内容。当你下载文件时,希望获得的是完整的文件,而不仅仅是文件的一部分,因为如果数据丢失或乱序,都不是你希望得到的结果,于是就用到了TCP。
TCP(Transmission Control Protocol)协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的RFC 793定义。TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管中的水流。
报文格式:
TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte)构成,长度可变。其中前20B格式固定,后40B为可选。
因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,同时IP包首部也包含最少20B,所以一个IP包或TCP包可以包含的数据部分最大长度为65535-20-20=65495B。
TCP报文中数据部分是可选的,即TCP报文可以不包含数据(同理IP包也可以不包含数据)。不含数据的TCP报文通常是一些确认和控制信息类的报文,如TCP建立连接时的三次握手和TCP终止时的四次挥手等。
1、源端口号(Source Port)
16位的源端口字段包含初始化通信的端口号。源端口和IP地址的作用是标识报文的返回地址。
2、目的端口号(Destination Port)
16位的目的端口字段定义传输的目的。这个端口指明接收方计算机上的应用程序接口。
3、序列号(Sequence Number)
该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第几个数据字节。序列号是一个32位的数。
4、确认号(Acknowledge Number)
TCP使用32位的确认号字段标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号的字段只在ACK标志被设置时才有效。
5、首部长度
长度为4位,用于表示TCP报文首部的长度。用4位(bit)表示,十进制值就是[0,15],一个TCP报文前20个字节是必有的,后40个字节根据情况可能有可能没有。如果TCP报文首部是20个字节,则该位应是20/4=5。
6、保留位(Reserved)
长度为6位,必须是0,它是为将来定义新用途保留的。
7、标志(Code Bits)
长度为6位,在TCP报文中不管是握手还是挥手还是传数据等,这6位标志都很重要。6位从左到右依次为:
• URG:紧急标志位,说明紧急指针有效;
• ACK:确认标志位,多数情况下空,说明确认序号有效; 取1时表示应答字段有效,也即TCP应答号将包含在TCP段中,为0则反之。
• PSH:推标志位,置位时表示接收方应立即请求将报文交给应用层;
• RST:复位标志,用于重建一个已经混乱的连接,用来复位产生错误的连接,也会用来拒绝错误和非法的数据包。
• SYN:同步标志,该标志仅在三次握手建立TCP连接时有效
• FIN:结束标志,表示发送端已经发送到数据末尾,数据传送完成,发送FIN标志位的TCP段,连接将被断开。
8、窗口大小(Window Size)
长度为16位,TCP流量控制由连接的每一端通过声明的窗口大小来提供。
9、检验和(Checksum)
长度为16位,该字段覆盖整个TCP报文端,是个强制性的字段,是由发送端计算和存储,到接收端后,由接收端进行验证。
10、紧急指针(Urgent Pointer)
长度为16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。
11、选项(Options)
长度为0-40B(字节),必须以4B为单位变化,必要时可以填充0。通常包含:最长报文大小(MaximumSegment Size,MSS)、窗口扩大选项、时间戳选项、选择性确认(Selective ACKnowlegement,SACK)等。
12、数据
可选报文段数据部分。
补充:
源端口(Source port)和目的端口(Destination port)
各16 bits。IP地址标识互联网中的不同终端,端口号标识终端中的不同应用进程,具有本地意义。32位IP + 16位端口号 = 48位插口。
端口由互联网数字分配机构(Internet Assigned Numbers Authority,IANA)分配,TCP和UDP端口号列表。
著名端口号(Well-known) | 注册端口号(Registered) | 动态端口号(Dynamic) |
0~1023 | 1024~49151 | 49152~65535 |
IANA统一分配 | 向IANA申请注册 | 本地分配 |
链接(握手)过程和断开(挥手)过程:
-
- 创建连接的三次握手过程
- client向server发起连接请求(第一次握手)
- SYN置1, seq=x
- server收到了client发送的数据包后,会向client发送一个应答,同时发送一个序号(第二次握手)
- ACK=1, ack=x+1, seq=y
- client收到server的应答后,向server发送最后的应答(第三次握手)
- ACK=1, ack = y+1
- client向server发起连接请求(第一次握手)
- 创建连接的三次握手过程
-
- 连接断开四次挥手过程
- client向server发送请求断开的数据包(第一次挥手)
- FIN = 1, seq = m
- server收到了client请求断开的数据包后,会向client端发送应答(第二次挥手)
- ACK = 1, ack = m + 1
- 当server数据交换完成,也不需要通讯的时候,向client发送断开数据包(第三次挥手)
- FIN = 1,seq = n
- client最后向server发送应答(第四次挥手)
- ACK = 1, ack = n + 1
- client向server发送请求断开的数据包(第一次挥手)
- 连接断开四次挥手过程
TCP协议的特点
- 面向连接
- 仅支持单播传输
每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。
- 面向字节流
TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。
- 可靠传输
- 提供拥塞控制
当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞
- TCP提供全双工通信
TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)
二、UDP报文:
UDP(User Datagram Protocol)协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
报文格式
UDP数据报由首部和数据两部分组成,其中首部只有8B(字节)。
1、源端口号(Source Port)
长度为16位,指明发送数据的进程。
2、目的端口号(Destination Port)
长度为16位,指明目的主机接收数据的进程。
3、长度
长度为16位,该字段值为报头和数据两部分的总字节数。
4、检验和(Checksum)
长度为16位,UDP检验和作用于UDP报头和UDP数据的所有位。由发送端计算和存储,由接收端校验。
5、数据
UDP特点:
1. 面向无连接
首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。
具体来说就是:
- 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了
- 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作
2. 有单播,多播,广播的功能
UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
3. UDP是面向报文的
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文
4. 不可靠性
首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。
并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。
再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。
5. 头部开销小,传输数据报文时是很高效的
三、TCP和UDP的区别
-
连接性:
- TCP:
- TCP是面向连接的协议,通信前需要进行三次握手建立连接,通信结束后需要四次挥手释放连接。
- 提供可靠的数据传输,通过序列号、确认应答、重传机制等确保数据的完整性和顺序性。
- UDP:
- UDP是无连接的协议,发送数据包时不需要建立连接,也没有连接维护的开销。
- 不提供可靠性保证,数据包可能丢失、重复或乱序,应用层需要自行处理。
- TCP:
-
数据传输方式:
- TCP:
- TCP采用字节流传输方式,将数据分割成小的数据段进行传输,并在接收端重新组装。
- 保证数据的完整性和顺序性,避免了数据包的拆分和重组。
- UDP:
- UDP采用数据报传输方式,每个数据包独立发送,没有拆分和重组的过程。
- 每个数据包都是一个完整的消息,没有顺序性要求,也没有重传机制。
- TCP:
-
可靠性:
- TCP:
- TCP提供可靠的数据传输,通过确认应答、重传机制、校验和等手段确保数据的正确性。
- 数据包在传输过程中如有丢失或损坏会被重新发送,保证数据的完整性。
- UDP:
- UDP不提供数据传输的可靠性保证,数据包可能会丢失或乱序,应用层需要自行处理错误情况。
- TCP:
-
开销:
- TCP:
- TCP协议有较多的控制信息和机制,如确认、流量控制、拥塞控制等,导致通信开销较大。
- 适用于对数据传输可靠性要求高的场景,如文件传输、网页浏览等。
- UDP:
- UDP协议没有连接管理和重传机制,通信开销较小,适用于实时性要求高的应用,如音视频传输、在线游戏等。
- TCP:
综上所述,TCP和UDP在连接性、数据传输方式、可靠性和开销等方面存在明显的区别,选择合适的协议取决于具体的应用需求和网络环境。
以上是小编的一些理解如有错误还请各位大佬不吝赐教,感谢!!!