参考资料:https://baijiahao.baidu.com/s?id=1593714120815701015&wfr=spider&for=pc
- TCP、UDP是什么
- TCP、UDP的区别
- TCP的前世今生
- TCP三次握手、四次挥手
TCP、UDP是什么?
-
TCP:传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接(面向连接),之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
-
UDP:用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接(面向无连接),且没有超时重发等机制,故而传输速度很快。
TCP、UDP的区别?
-
最大的区别在于TCP是面向连接,UDP是无连接的==,所谓“面向连接”和“面向无连接”,比如就是打电话和写信。
TCP是就像打电话,两个人如果要通话,首先要建立连接——即打电话时的拨号,等待响应后——即接听电话后,才能相互传递信息,最后还要断开连接——即挂电话。写信就简单了,只需要知道对方的收件地址(对应着网络中的IP地址,当然还有端口号) -
TCP面向连接消息传递可靠性高,但也正因为需要建立连接,使资源开销加大(在建立连接前必须等待接受方响应,传输信息过程中必须确认信息是否传到及断开连接时发出相应的信号等),独占一个通道,在断开连接钱不能建立另一个连接,即两人在通话过程中不能再与第三方通话。
-
UDP是面向无连接,只需要知道对方的地址你就能写信给他,因而在一定程度上也无法保证信息传递的可靠性了。但也因为无需建立连接,无需返回确认收到的信息,传输速度快。
TCP的前世今生
-
计算机网络的出现比互联网要早很多
-
计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容,就像一群人有的说英语,有的说中文,有的说德语,说同一种语言的人可以交流,不同的语言之间就不行了。要想全世界一起交流,就必须确定一种所有计算机都能听懂的语言,TCP/IP就是为此而生。
-
TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议、IMCP协议、TCP协议以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了统一语言一样,就可以和其他的计算机终端做自由的交流了。因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议。
TCP三次握手、四次分手
-
握手分手过程回顾
三次握手过程
-
1.在创建连接时,客户端首先要SYN=1,表示要创建连接,
-
2.服务端接收到后,要告诉客户端:我接受到了!所以加个ACK=1,就变成了ACK=1,SYN=1
-
3.理论上这时就创建连接成功了,但是要防止一个意外(见疑问三),所以客户端要再发一个消息给服务端确认一下,这时只需要ACK=1就行了,到此三次握手完成!
四次分手过程
-
1.首先客户端请求关闭客户端到服务端方向的连接,这时客户端就要发送一个FIN=1,表示要关闭一个方向的连接(见上面四次分手的图)
-
2.服务端接收到后是需要确认一下的,所以返回了一个ACK=1
-
3.这时只关闭了一个方向,另一个方向也需要关闭,所以服务端也向客户端发了一个FIN=1 ACK=1
-
4.客户端接收到后发送ACK=1,表示接受成功,到此四次分手完成!
我为什么没有在握手分手的过程中,解释seq和ack呢?就如我对这两个关键字的解释的一样,这两个是数据拆分和组装必备元素,所以所有的请求都需要这两个元素,只要明白了作用,就可以自己举一反三。
-
疑问一:SYN、ACK、FIN、seq、ack各代表什么意思
SYN,ACK,FIN,seq,ack存放在TCP的标志位,一共有6个字符,这里就介绍这三个:
- SYN:代表请求创建连接,所以在三次握手中前两次要SYN=1,表示这两次用于建立连接,至于第三次什么用,在疑问三里解答。
- FIN:表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为TCP的连接是双向的,所以一次FIN只能关闭一个方向。
- ACK:代表确认接受,从上面可以发现,不管是三次握手还是四次分手,在回应的时候都会加上ACK=1,表示消息接收到了,并且在建立连接以后的发送数据时,都需加上ACK=1,来表示数据接收成功。
- seq:序列号,什么意思呢?当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。
初始序列号是随机生成的,这样不一样的数据拆包解包就不会连接错了。(例如:两个数据都被拆成1,2,3和一个数据是1,2,3一个是101,102,103,很明显后者不会连接错误)
- ack:这个代表下一个数据包的编号,这也就是为什么第二请求时,ack是seq+1,千万千万别把ACK和ack搞混了
关于握手和分手,主要还是SYN,FIN,ACK的变化,这才是重点!
-
疑问二:每次发送请求时为什么ack要+1?
- 关于seq和ack关键字的解释中已经说明了,因为
-
疑问三:为什么需要三次握手?
- 下面解释明明两次就可以建立连接的为什么还要加第三次的确认。如果发送两次就可以建立连接话,那么只要客户端发送一个连接请求,服务端接收到并发送了确认,就会建立一个连接。
可能出现的问题:如果一个连接请求在网络中超时了,这时客户端会从发请求,但是这个跑的慢的请求最后还是跑到了,然后服务端就接收了两个连接请求,然后全部回应就会创建两个连接,浪费资源!如果加了第三次客户端确认,客户端在接受到一个服务端连接确认请求后,后面再接收到的连接确认请求就可以抛弃不管了,超时重发,丢弃重复数据,正是三次握手的强大体现。
-
疑问三:为什么需要四次分手?
- TCP是双向的,所以需要在两个方向分别关闭,每个方向的关闭又需要请求和确认,所以一共就4次。