浅析TCP协议与UDP协议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析TCP协议与UDP协议相关的知识,希望对你有一定的参考价值。

TCP(Transmission Control Protocol,全称传输控制协议。工作在TCP/IP协议栈中的传输层,为主机层对主机层的连接提供了可靠的链接服务。此协议通过三个步骤使客户机与服务器建立一个连接,并通过四个步骤关闭此连接,这个过程我们分别称之为三次握手和四次挥手。

UDP((User Datagram Protocol,全称用户数据报协议。同样工作在传输层,是一种非面向连接的协议,因为其无恢复数据功能,所以是一种不可靠的网络访问。但因为发送数据时无需向TCP一样反复建立连接,所以内存占用率小,传输性能高。

一:何为TCP/IP协议栈?

1.名词解释

TCP(Transmission Control Protocol 传输控制协议)/IP(Internet Protocol  因特网互联协议)栈,是以TCP和IP协议为重要代表的多个协议的集合,该集合中还包括UDP、ICMP、RIP、TELNET、 FTP、SMTP、ARP等许多协议。

2.历史:

最早发源于美国国防部(缩写为DoD)的 因特网的前身ARPA网项目,1983年1月1 日,TCP/IP取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护。

3.TCP/IP协议栈结构:

我们知道,早期的OSI参考模型将网络分为七层,而TCP/IP模型将网络分为了五层,如下图:

技术分享

             图一 : TCP/IP与OSI参考模型对比图(点击查看高清大图)

二:深入理解TCP协议的三次握手和四次挥手

首先让我们了解TCP首部组成结构,如下图:

技术分享

                           图二 :  TCP首部结构 (点击查看高清大图)

(1)源端口和目标端口:

一般情况下,源端口为客户端,目标端口为服务器端。由图二可知源端口和目标端口各占16位,也就是2^16-1=65535,所以客户端理论上来说可以打开65535个程序来访问服务器端。其中客户机端口号随机生成,而服务器端口固定不变。可以通过 cat /etc/service 配合grep查看常见服务所用端口号。

(2)序号(seq):

表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位 表示,所以每2^32个字节,就会出现序列号回绕,再次从 0 开始

(3)确认号(ack  acknowledgement character):

表示接收方期望收到发送方下一个报文段的第一个字节数据的编号

                              总的来说,seq和ack都是数据包的序号。

(4)重要标记位:

从图二我们可以看出,标记位共有六个,每一个只占一位,所以标记位取值只有0 、1种情况。


URG: 是否包含紧急数据(urgent)

PSH: 传送(push)

RST:释放连接并重置(reset)

ACK:表示前面的确认号字段(ack)是否有效。连接建立后,ACK=1。

SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1 ,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1带SYN标志的TCP报文段称为同步报文段

FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即 告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报 文段称为结束报文段


好,了解完TCP首部结构中常用知识点后,让我们以客户端的三次握手和四次挥手为例,来具体了解建立连接和断开连接的具体过程。

建立连接(三次握手)

技术分享

                                                                    图三:三次握手(点击查看高清大图)          

第一步:处于close状态的客户端A主动打开,并对服务器B说:“我向你发送了序号为x的包(seq=x),请求建立连接(SYN=1),over”,并转为同步已发送状态SYN-SENT),等待B确认。


第二步:服务器B每隔一段时间就会转为侦听LISTEN)状态,这时B收到来自A的请求,于是他向客户端A说:“我同意建立连接(SYN=1),并且确认已经收到了你的包(ACK=1),并向你发送了y包(seq=y),请求你继续给我发你下一个包(ack=x+1)“,并转为同步收到(SYN-RCVD)状态。


第三步:到此,AB都第一次收到了对方的包,第一次同步全部完成。

A收到B包后对B说:“我知确认你的请求了(ACK=1),并继续向你发送序号为X+1的包(seq=x+1),请求你继续向我发送你下一个包吧(ack=y+1)。”并转为已建立连接(ESTABLISHED)状态。B在收到A的包后,也转为已建立连接(ESTABLISHED状态。


  至此,AB都进入了ESTABLISHED(已建立连接)状态。三次握手已全部完成,AB双方将进入数据传送状态。

断开连接(四次挥手)

技术分享

                           图四:四次挥手(点击查看高清大图)

第一步: 客户机A对服务器B说:”我要和你断开连接(FIN=1)“。与此同时,向B发送了一个序号为u的包,并将状态由建立连接状态(ESTABLISHED)转换为终止等待1(FIN-WAIT-1)状态


第二步: B收到A的包时,得知A要与自己单方面分手,于是先通知应用程序关闭,接着对A说:”我已经收到你的分手请求了(ACK=1),但并不代表我同意分手,请你向我发送你的下一个包(ack=u+1)“,并向A发送序号为v的包。并被迫将状态转为闭等待状态(CLOSE-WAIT)


第三步: 由于B可能还有一些属于A残留数据没有发送给A,所以,B还会发数据给A,这中间A将处于终止等待2状态(FIN-WAIT-2),直到B发完。当财产分割完成以后,B对A说:”好啦,我已经接收到了你的分手请求包(ACK=1),属于你的数据我也都还给你了,我同意和你分手(FIN=1),你可以给我发你下一个包啦(ack=u+1)“,并向A发送第w个包。并且转为最后确认状态( LAST-ACK)


第四步:A收到B的w包,并对B说:”我已经收到了你的分手确认(ACK=1),请你给我个回复(ack=w+1),“,并向B发送序号为u+1的包。

从图四中我们可以看出,当服务器B收到u+1这个包时,就立即转换为closed状态了;而A却没有立即转为closed状态,而是转为了时间等待状态(TIME-WAIT),这个等待时间为2倍的MSL(最长数据传输时间)。所以客户端A留出了足够时间来接受来自B的残留数据。

当服务器将属于A的残留数据全部归还后,客户端A最终转换为closed关闭状态,四次挥手结束,连接关闭成功。

以上是关于浅析TCP协议与UDP协议的主要内容,如果未能解决你的问题,请参考以下文章

浅析TCP协议与UDP协议

SOCKET, TCP/UDP, HTTP, FTP 浅析

UDP和TCP浅析

浅析im即时通讯开发中TCP和UDP的区别

浅析TCP字节流与UDP数据报的区别

CDN快讯阿里云对HTTP/3新一代网络传输协议QUIC浅析