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模型将网络分为了五层,以下图:同步
图一 : TCP/IP与OSI参考模型对比图(点击查看高清大图)it
二:深刻理解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关闭状态,四次挥手结束,链接关闭成功。