当我们在浏览器地址栏输入https://www.baidu.com/按回车键进行发送时,你可知道你所在的电脑和百度服务器发生了怎样的数据交换,有人会说,这很简单,不就是所在客户端浏览器发起了http报文请求,然后百度Web服务器响应http报文请求的过程嘛,单纯的就http请求来说,上面的说法没错。但其实你往深入的想想,就会发现还有很多一些列的问题,例如:
- http的请求报文数据需要经过哪些步骤才能从我的电脑到达服务器
- 发送方的请求数据报文丢失了,如何处理
- 发送的请求数据是如何找到服务器的,中间需要经历的链路怎么确定
这些问题就是今天我要讲的TCP/IP协议族。
进入正题之前,先来一起过下http请求报文和响应报文的过程以及数据格式,如下所示:
http请求报文:
http响应报文:
好了,正式进入正题,可以理解在应用层面,http请求报文是以上述图中所示的数据进行发送,同理的,应用层面还有ftp(文件上传下载)、DNS(域名IP查找)和SMTP(电子邮件)等协议,不可能每个应用层协议都有一套自己的数据发送过程,所以上述各种应用层协议发送的数据统一向下委托给某个模块统一处理,这个模块就是传输层(TCP协议和UDP协议),在这一层会以数据包的形式发送给对方,数据包的头部包含发送接收方IP 端口号、序号和ACK号,除了头部,还包含真正要发送的数据块。这里看你选择的协议是有连接状态的TCP还是无连接状态的UDP,来决定当由于网络等各种原因,导致对方没有收到你的数据,是否需要重传。具体有关TCP和UDP协议的过程,还有很多细节(报文的具体字段及丢失重传机制和网络拥塞滑动窗口等),希望后面会有专门一篇文章来讲解。
从上述可知,传输层就是把应用层委托下来的数据,在该层进行分块以一个一个数据包的形式进行发送,接收方在相应的传输层,拿到一个一个的数据包最后会组装成一个完整的数据给到应用层(例如上图中所示的http响应报文)。好的,那我们继续往下讲,传输层数据继续往下走,需要发送到具体的IP地址服务器上去,这就需要网络层,网络层的作用就是根据对方的IP,通过和自己相连的集线器、路由器设备,一层一层往上走,找到一条路径,最后数据包到达服务器上。
?
最后还有一个数据链路层,其实就是以太网和wifi,例如电脑通过网线连接到集线器上,就是制定好了一种协议,WIFI也是类似,有这个协商好的协议在,大家都遵循这个标准,就可以在这个链路上进行数据转发和通信。简单的把四层网络模型都简述完了,如下图:
?
TCP三次握手建立连接:
客户端先发送一个建立连接的数据包,序列号为J,服务端收到该数据包,也发送一个建立连接(SYN为1)的数据包,对之前包的确认ack为收到包的序列号加1,客户端收到之后,说明客户端的连接已经建立;同理客户端需要对服务器发送过来的该数据包进行确认,同样需要发送一个确认包(ack=K+1),服务端收到数据包之后,服务端这边的连接状态也建立。自此,客户端和服务端两边的链接都已建立起来。
?
TCP四次挥手断开连接:
数据包的发送参照上面三次握手的数据包定义,为什么这里需要4次呢,因为TCP的客户端和服务端是全双工模式,需要两边都确认为关闭状态,这条TCP连接才真正的断开了。
?
|