浅析TCP协议与UDP协议

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

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

一:何为TCP/IP协议栈?
ide

1.名词解释性能

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

2.历史:blog

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

3.TCP/IP协议栈结构:get

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

wKiom1mqGErD5UTHAAIM21JuTwY273.png-wh_50

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

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

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

wKioL1mqTMvxI4JPAAFy5aWl-DM010.png-wh_50

                           图二 :  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首部结构中经常使用知识点后,让咱们以客户端的三次握手和四次挥手为例,来具体了解创建链接和断开链接的具体过程。

创建链接(三次握手)

wKiom1mqYijhY5plAAXBUPsMlek767.png

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

第一步:处于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双方将进入数据传送状态。

断开链接(四次挥手)

wKioL1mqgzujanaFAAhnZaQ19Co206.png-wh_50

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

第一步: 客户机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关闭状态,四次挥手结束,链接关闭成功。

相关文章
相关标签/搜索