学习OSI参考模型的传输层时,了解 TCP(传输控制协议)是面向连接的可靠传输协议,UDP( 用户数据报文协议)是非面向连接的不可靠传输协议,当然两者各有优缺点,比如学生上课这个活动,TCP协议相当于面授,UDP协议相当于远程授课、网上授课,面授的好处学生听不懂直接告诉老师,老师再讲一遍,直到学生听懂,这种学习方法很可靠。而远程授课学生和老师不方便沟通,学生有问题发过去了,老师却没看见,学习方式不可靠,但是讲课的花费的时间比面授少一些。
那么在网络中如何让实现这种可靠的传输呢?必定是有一个种面向可靠连接的机制——三次握手 四次断开
TCP报头
在了解三次握手和四次挥手之前,先知道TCP报头里包含了哪些东西。
1、TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要内保存对方信息
2、报文主要段的意思
-
序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号
-
确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。
-
ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
-
SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接
-
FIN:结束标志,用于释放连接,为1表示关闭本方数据流
三次握手
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。如图:
注:其中SYN 同步序列号请求、seq 序列号——记录发送的次数、ctl 状态
过程图解:
-
连接开始时,连接建立方(Client)发送SYN包,并包含了自己的初始序号a;
-
连接接受方(Server)收到SYN包以后会回复一个SYN包,其中包含了对上一个a包的回应信息ACK,回应的序号为下一个希望收到包的序号,即a+1,然后还包含了自己的初始序号b;
-
连接建立方(Client)收到回应的SYN包以后,回复一个ACK包做响应,其中包含了下一个希望收到包的序号即b+1。
四次断开
所谓四次断开(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。如图:
过程图解:
-
首先进行关闭的一方(即发送第一个FIN)将执行主动关闭,而另一方(收到这个FIN)执行被动关闭。
-
当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
-
同时TCP服务器还向应用程序(即丢弃服务器)传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN。
-
客户必须发回一个确认,并将确认序号设置为收到序号加1。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。
~inspire 发布了70 篇原创文章 · 获赞 56 · 访问量 1944 私信 关注