关于tcp基础知识和三次握手四次挥手浅谈(拼凑)

什么是tcp?

来自百度百科:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

顺便给自己普及什么是udp:DP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

浅析字面理解:可信传输和不可靠传输。

引用知乎来自知乎tcp和udp区别

作者:大瑾

tcp:

即A传输给B的时候,B会确认收到(发回一个ACK信息)

比如说,我下载一个文件,这个文件很大,有300M吧。
那么服务器给我发送的时候肯定不会300M一起发过来。这个300M的文件会可能会被分成1000份,每份是300 000 KB/1000 = 300 KB,那么服务器又是怎么发的呢,它给这些文件加上编号,比如第1份300KB的编号是0001,第二份是0002,然后通过IP给你发过来。当你收到0001的时候,你给服务器发个消息,说我收到0001了,那么服务器会给你发0002,当然可能因为带宽比较足,它可能直接0002和0003一起发,当然一起发的意思是,它先发了0002,但是没收到你0002的确认ACK的时候,它接着继续发了0003,那么你收到之后,可以一并发个0003收到的信息,这就表示我从0001到0003都收到了。然后服务器收到了,啊,你又收到了,说明网络状态不错,我不如一次发4份好了,然后它一次发了0004,0005,0006,0007,这时候0005在传输的过程中可能不见了,这时候你收到0004,0006,0007三个包,那你怎么回复服务器呢,假如你说你收到0007了,对方觉得你所有包都收到了,就接着发下面的包了,那么最后完成的时候,文件是破损的,因为缺少了0005。所以你的回复应该是0004,0004,0004,服务器收到三个一模一样的确认信息,它就会想,啊是不是中间丢了一个包?所以他就会再发一次0005。这叫Fast Retransmit。如果你的回复只有0004。服务器就会以为网络不好,它等啊等,等啊等,发现还是没收到你的确认。这时候它才会重发0005。一般这个过程叫time out。等的过程一般是比你回复三个重复的ACK要长的。所以为了快速发现丢包的状态,一般会选择第一种回复状态。

udp:

即A传输给B的时候,B不会发确认收到信息。
假如说我现在在看网上足球直播。
假如你的带宽很足,服务器一下发了0001,0002,0003,0004.。。。0008这么多个包,但是0002的包丢了。如果是TCP,即使它收到了7个包,但是还有一个丢了啊。所以不行,还不能给你看,我要等0002的包到了再给你看,这时候它就会给服务器说,0002没收到,没收到,没收到。。。但这一来一往的要时间,恰好这几个包就是传输xx球员进球的一幕,外头你的室友们在用电视看,因为丢包,你的电脑就是不放,然后你听到外面一阵欢呼,还不明所以然呢,等过了好几秒TCP收到0002了你才看到,啊,原来是xx球员进球了。黄花菜都凉了。
UDP就不考虑这个,服务器就给你发包,不要你确认。假如到你这边的时候丢了个包,在屏幕上的效果可能也就是屏幕上某一帧卡了一下,本质不影响你看球,还是实时的转播。

接着看看tcp的结构(图片来自网络,侵删)
关于tcp基础知识和三次握手四次挥手浅谈(拼凑)_第1张图片

Sequence Number 序列号

序列号是用来标记包的顺序的,假设有一段要传输的内容大小有9000字节,按照1460字节一个包的大小,假设初始序号为10000,那么我们就把这段内容分为10000-11460, 11460-12920,... 18760-19000 一共7个包。

网络包由于网络问题,可能并不是顺序到达接收端的,那么接收端可以按照序列号来重新组装这段内容。

用于解决包乱序的问题。


Acknowledgment Number 接收号

用于确认收到,解决不丢包的问题。

序列号有两个说明什么?

说明tcp是全双工的,就是说,tcp的任意一端可以发送数据,也可以接收数据。

Tag位

就是上图中的URG,ACK,PSH,RST,SYN,FIN位,每个位置一表示的意思是:

URG:紧急位,RFC已经建议废弃
ACK(acknowledgement):说明这个包中带有回复信息
PSH:说明这个包中有传输数据
RST:重置位,说明这个包是用来要对方重置连接
SYN:synchronization(同步) 建立连接,说明发送方向另一方发送建立连接的请求
FIN:结束位,说明发送一方告知另外一方,要请求中断连接


三次握手

TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求!

三次是保证双方互相明确对方能收能发的最低值。

理论上讲不论握手多少次都不能确认一条信道是“可靠”的,但通过3次握手可以至少确认它是“可用”的,再往上加握手次数不过是提高“它是可用的”这个结论的可信程度。

三次握手图:(同样来自网络,侵删)

关于tcp基础知识和三次握手四次挥手浅谈(拼凑)_第2张图片

简述:

A -- > B (b知道a能发消息)

A < -- B(a知道b能发消息能收消息) A->ESTABLISHED

A -- > B (b知道a能收消息)                B->ESTABLISHED


四次挥手 (来自http://blog.csdn.net/whuslei/article/details/6667471)

用来保障通讯双方可以安全的回收TCP通信的系统资源

关于tcp基础知识和三次握手四次挥手浅谈(拼凑)_第3张图片

中断连接端可以是Client端,也可以是Server端。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

你可能感兴趣的:(计算机网络)