浅析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协议的主要内容,如果未能解决你的问题,请参考以下文章