前面记录了计算机网络基础框架,这里简单总结一下两个最常用的传输层协议,TCP、UDP。
1.TCP
TCP的传输主要分为三步,先建立连接,再传输数据,最后断开连接。下图是官方的TCP格式:
我们挑重点看一下:
首先是第一行,分别代码端口号和目标端口号,这里的端口号是用来识别具体的应用程序的。
第二行和第三行分别是序列号和确认号,这两个一般是搭配使用的,简单来说,如果数据很多的话,TCP会将这些数据分成很多个包,依次发过去,但发过去如果对方在拼接的时候没有按照正确的顺序进行拼接,那不歇了菜了,所以需要给这些发过去的包按顺序标一个号,对方收到这些包,再按这个号排列一下这些包,就可以完成数据的准确传输,但在TCP中,拥有一个应答机制,即你收到了这个包,你得给我回复一下,你回复了我就知道你已经收到了这个包,我这边也就放心了。这就对应了这两块的内容。
第三行,可以看到中间有六个顺序排列的英文标识,这个是标志位,每一位都有自己的含义,主要要看的有ACK、SYN、FIN,这个在连接的时候会用到,等会记录连接的时候会具体说说。第三行的后面是窗口号,这个用来表面接收端能够处理数据的多少,一会也会仔细说。
第四行开头是个校验的内容,跟CRC类似,就是通过算法把这些数据出一个结果,接收到后在通过同一个算法用这些数据出一个结果,比对一下,看数据对着没。
然后我们再来看看TCP的一些主要内容:
①三次握手
想必大家都听过三次握手和四次挥手,三次握手用于设备的连接,四次挥手用于设备断开连接。
三次握手的主要过程就是下面三步:
总结一下:两个设备要建立连接,需要三步,A设备先向B设备发送SYN=1,表示想与B建立连接,B设备收到后,回复一个SYN=1,ACK=1,表示收到A发来的连接信息,并同意此次连接,A收到B发来的同意连接回复后,再发送一个ACK=1,表示收到了B回复的消息,自此连接建立,A和B就可以开始发送数据。这里提到的ACK和SYN就是前面提到的标志位,用来标识数据的状态作用。具体发送的时候不会只发上述的标志位,还会有别的信息,这里只是就三次挥手简单介绍一下。然后为什么是三次?两次行不行,大家可以自己想一下,我们需要双方进行连接,并且双方都有确认对方的数据接收状态,最少就得三步,少一步都完不成。
②重传机制
TCP中,A每发送一个数据包,就需要B回复一个信号,表明这个包已经接收到了,那如果传输过程中出现了什么问题呢?比方说A发了一个包,但一直没等到B传回来的信号怎么办?这个时候A就应该知道,这次数据的传输出现了问题,A在等待了一段时间后,如果B还是没有传来相应的信息,那么A就会认为这个包没发过去,就会把这个包重新发一下,这个就是超时重传机制。还有一种重传的机制,假设A给B发过去了5个包12345,我们让B每一次回复的时候,不是回复收到的每一个包的名字,而是回复完整接收到的包名字的最大值+1,听起来有些绕,举个例子,A给B发送这5个包时,B收到了1这个包,就回复一个2,收到了1和2这两个包,就回复一个3,但如果3号包没收到,收到了4号包,回复的还是3,因为只有12号包是连续完整的,1234号包中间少了个3号包,所以只取连续的包的最大值+1。这个时候如果有三次A收到的B传回来的数据都说一样的,假设回复了3个3,这个时候我们就应该知道数据包的发送出问题了,3号包一直没收到,这个时候就要补发一下3号包,这也是一种重传机制。一般这种重传用来多一点,因为每个包都回复的话占用的资源会更多。
③滑动窗口
这个窗口就是上面格式里面的那个窗口,这个滑动窗口是用来记录接收端一次可以同时接收多少个包的。A往B发包的时候,不能一次有多少发多少,要考虑B能承受的接收状况,一次发的太多了,B接收不过来,那数据丢失了还得重传,那不就麻烦了。这里也是举个例子:假设A要给B发100个包,当A给B发了一个包后,B给A回复的时候说,我只能处理五个包,超过范围我就处理不了了,这时A就知道了,此时的滑动窗口为5,那A发送了5个包后就会停下来等一下,等B处理这些包,当B处理好后,会给A进行回复,此时如果B回复说我处理好了1个包,那A就继续发1个包,就这样一直来回的交流,等啥时侯B可以处理的包多了,就会在回复A的时候说,我现在可以处理8个包了,那A就知道了,此时的滑动窗口变成8了,那就可以多发几个包了。简单总结一下:就是说滑动窗口的总大小是固定的,A发送一个包,滑动窗口内就填一个,填满了A就不能发了,B回复一个,滑动窗口里面就减一个,A就可以继续发了。TCP就是靠着这个机制来保证数据不会超出处理的范围。
④四次挥手
四次挥手是用来断开连接的,因为TCP可以双向发送数据,所以每一方都要保证断开了连接。
四次挥手主要就是以下四步:
总结一下:两个设备要断开连接,还是以AB举例。A数据发完了马,想要断开连接,A就给B发一个FIN=1,B收到后回复一个ACK=1,表示收到了A的断开请求,自此A就不能主动给B发数据了,但这个时候A还可以接收数据,等到B回复完了A发来的数据包时,B也给A发一个FIN=1,表示要跟A断开连接,A收到后回复一个ACK=1,表示收到并断开连接,自此AB完成断开连接。这里提到的FIN就是上面TCP格式中的标志位。
因为TCP数据的传输有一定的保障,所以一般用于需要准确传输数据的场景。例如文件的传输、网页的浏览等场合。
2.UDP
相对于TCP来说,UDP没有那么多的确认机制,甚至都不用建立连接,UDP协议只需要将数据发出去就行了,其包括下列内容:
源端口号、目标端口号、UDP长度、校验内容、数据
可以看出这比TCP少了非常多的东西,而导致的缺点也很明显:传输不可靠,如果发送数据时出现丢包和出错也不会有任何的管理措施。但其存在必有其道理,由于UDP协议不需要应答机制,因此UDP协议在传输速度上就有着很大的优势,也会消耗更少的资源,因此其主要应用于只要求传输速度快,但传输时丢几个包问题不大的场景。
举个例子,比方说打游戏,你打游戏的时候需要的是数据非常准确,拥有确认机制,还是传输速度非常快,可以实时动态响应?自然是希望速度快了,谁也不希望打游戏时每一步还需要界面等待响应一下。这里就是举个例子,实际情况可能还会有一些处理机制。
这里简单的介绍了一下TCP和UDP的入门内容,这两个协议的内容还有很多很多,感兴趣的可以再深入了解,有什么不对的地方也希望可以指出。