一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
网络协议系列 第1篇--网络分层,TCP/IP五层模型【掘金日新计划】
网络协议系列 第2篇--传输层工作原理【掘金日新计划】
网络协议系列 第3篇--TCP有哪些机制【掘金日新计划】
网络协议系列 第4篇--应用层HTTP发展史【掘金日新计划】
网络协议系列 第5篇--HTTPS原理【掘金日新计划】
网络协议系列 第6篇--网络协议串讲【掘金日新计划】
网络协议系列 第7篇--补充一些底层网络知识【掘金日新计划】
前言:每日革新自我、追求进步。积土而为山,积水而为海。由于面试的时候,传输层的TCP和UDP经常会被放在一起问。所以本篇将从这两个协议入手,从协议的包头开始介绍,围绕TCP的 面向连接、状态服务 展开,到协议的工作原理,尝试将这两个协议叙述清楚。
周尛先森
传输层工作原理
网络协议虽然是大家都应了解的基本知识,但网上很多相关文章总会忽略一些内容,没有阐明完整的逻辑脉络,我当年学习它的时候也废了挺大功夫。
网络分层、TCP协议、HTTPS中对称与非对称加密,除了了解“它是什么”,你是否有想过“为什么是它”?我认为理解了后者才真正理解了网络协议。
本文以问题的形式逐步展开,一步步揭开计算机网络的面纱,希望能帮助你彻底搞懂网络协议。
TCP 和 UDP 有哪些区别?
我们先来看看他们的区别:
TCP是面向连接, UDP是面向无连接。
TCP将可靠交付, UDP则既不保证包的按需到达,也不保证不丢失。
TCP面向字节流, UDP是基于数据报。
TCP有拥塞控制, UDP则只管传输。
TCP有状态服务, UDP无状态服务。
接下来我们分别讨论两种协议。
TCP 包头都有什么?
以上就是TCP包头,这时候可能会有人问,这些包头是什么,分别代表什么,他们各自的作用又是什么。那么,现在就让我们一行一行解读,一点一点揭开TCP的面纱。
第一行
在本系列第一篇文章中介绍到,TCP和UDP是在传输层上运作的,而传输层的作用是将数据包分段,然后将数据包打包给模型的下一层,开始传输,然后在另一端将数据段重组。简而言之就是端到端通信(end-to-end),数据传输路径中最两端的两台网络设备之间的通信。
TCP包头只会包含自己层级所需要的信息就足够了。首先,传输层的上层是应用层,应用层顾名思义是应用处理的,而应用跑在设备上,都会有一个端口号。那很明显,TCP包头所带的端口号的作用就是找到应用,以及把自己应用的端口号也一并放到包头上。
第二行和第三行
第二行和第三行都是用来放序号的,给数据包一个编号,是在保证可靠交付的时候会使用到的一个标记。
第四行
接下来到第四行,这行主要存放着一些状态位和窗口大小信息。我们来看看这几个状态位分别代表什么:
URG:代表这是一个紧急数据,比如远程操作时,用户按下了 Ctrl+C 终止程序
ACK:代表响应
PSH:代表数据推送,也就是在传输数据的意思
RST:重新连接
SYN:发起连接,同步请求,也就是申请握手
FIN:结束连接,终止请求,也就是挥手
TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。
然后窗口大小,TCP 要做流量控制,通信双方各声明一个窗口,标识自己当前能够的处理能力。
第五行和第六行
第五行这里记录着TCP包头的校验和,用来校验数据包的完整性。第六行则可以放一些选项。
TCP 三次握手,是怎么建立连接的?
首先,TCP建立连接是在两台设备上建立的,假设现在有两台设备,设备A是我的电脑,设备B是服务器。现在A想和B建立连接(通过三次握手),具体流程就是:
在最开始的时候,A和B都处于 CLOSE 状态。B主动监听某个端口,处于 LISTEN 状态。
A会随机生成出序列号(这里的序列号一般叫做client_isn),并且把标志位设置为SYN(意味着要连接),然后把该报文发送给B。
A发送完SYN报文以后,便进入了 SYN_SEND 状态。
B接收到了A的请求之后,自己也初始化对应的序列号(这里的序列号一般叫做 server_isn)
在「确认号」字段里填上client_isn + 1(相当于告诉A,已经收到了发送过来的序列号了) ,并且把 SYN 和 ACK 标记位都点亮(置为1)。B的状态变成 SYN-REVD 状态
A收到服务端发送的 SYN 和 ACK 之后,发送 ACK 的 ACK,之后处于 ESTABLISHED 状态。
B收到 ACK 的 ACK 之后,处于 ESTABLISHED 状态。
至此TCP正式建立连接,可以开始传输报文了。
(图片来源于网络)
TCP 四次挥手,为什么是四次?
在建立好连接后,又是怎么断开连接的呢?接下来我们来看看四次挥手的工作流程。
A打算关闭连接,会发 FIN 报文给服务端(其实就是把标志位 FIN 点亮),A发送完之后,就进入FIN_WAIT_1 状态。
B收到 FIN 报文之后,回复 ACK 报文给A(表示已经收到了),B发送完之后,就进入 CLOSE_WAIT 状态。
A接收到服务端的 ACK 报文,就进入了 FIN_WAIT_2 状态。
B可能还有数据要发送给A,等B确认自己已经没有数据返回给客户端之后,就发送FIN报文给A了,自己进入 LAST_ACK 状态。
A收到B的FIN报文之后,回应ACK报文,自己进入 TIME_WAIT 状态。
B收到A的ACK报文之后,B就进入 CLOSE 状态。
A在TIME_WAIT等到2MSL,也进入了 CLOSE 状态。
(图片来源于网络)
UDP 包头都有什么?
UDP包头除了必要的端口号,和长度、校验,UDP包头明显比TCP包头简单很多,因为UDP只负责发送,所以可以比TCP少了状态位、窗口大小以及序号信息。
小结
我们从TCP和UDP两种协议入手,对比了两种协议的区别。然后开始讨论TCP头,介绍了TCP头的端口号、序号、校验码、状态位、窗口大小、选项。接下来到TCP的三次握手和四次挥手具体流程,每个时间节点下设备的状态,以及表述每个“请求”“应答”时,TCP头会携带的信息。最后是UDP包头的介绍。
本文主要围绕TCP的面向连接、状态服务展开,而TCP是如何做到可靠交付、怎么拥塞控制则放在下篇文章进行解答。
最后,让我们一起加油吧!
都看到这了,不如顺手点个赞再走 ( *ˇωˇ* )