一:数据传输
1、数据传输简单理解 在网络中通信的基础单位是字节,1字节(byte) = 8位(bit),这里的bit就是一种数字信号,对应着实际电路中高低电平,举个很通俗易懂的例子: A端为一个开关,B端为一个灯泡,假设定义灯泡“亮”状态为1,“灭”状态为0,如果A端按了8次开关分别是:开、关、开、关、开、关、开、关,那么B端这段时间对应的状态就是“10101010”,如果在A端在加个转换器能将数字“10101010”转换为电路的“开关开关开关开关”,那么就相当于A端把数据“10101010”发送到了B端,图示只是说明了A端到B端,反过来也成立。 上述理解了的话,那么我们就有了数字在网络中传输的概念,现在就有了一个基础,那就是在通信的2端,我们能收到对方发来的一系列字节组成的数据,如果通信双方靠一根线连着,那么很简单,只需要互相约定协议就能实现互相沟通,但是在 现实中,通信的双方往往是在一个庞大的网络中,首先要解决的是数据如何到达指定的一方
二:概念
首先要明白tcp/ip 是什么?他是一种协议簇,不是单指tcp协议或者ip协议,而是由多个协议组合而成系统,一般认为是一个4层协议系统,如下图
三:数据封装
当需要将一组用户数据,发送至网络前,数据会由上而下经过层层封装,每经过一个协议层,该协议层都会为数据加上自己独有的首部数据, 每层的首部都有自己的作用: 1、appl首部:用户自定义 2、tcp首部:包含了源端口,目的端口 3、ip首部:包含了目的ip地址,源ip地址 4、以太网首部:包含了源硬件地址和目的硬件地址 (源指一开始发送数据的一方,目的指消息最终到达的一方) 抛开以太网首部不说,ip首部可以确认消息应该到达的目的机器,tcp首部可以根据端口号确认消息应该被分配到哪个应用程序
四:数据发送
在链路层,设备驱动程序只会去解析以太网首部(硬件地址)来确认消息的目的硬件地址,他压根不会去解析数据获得网络层的ip地址,作为发送端,应用层本身是不知道接收端的以太网地址的,也就是目的以太网地址,但是tcp/ip 内部通过ARP和RARP来将ip与以太网地址进行映射,简单理解就是知道了ip就能知道对方硬件地址,反之亦然。知道了硬件地址,数据就能通过网络到达对端了 (在这里就不描述数据在网络中的路由过程了)
五:连接的建立与关闭
下图是一个tcp首部的格式内容,重点是红色框的几个标志位,对通信双方连接的建立和关闭起决定性作用
首先要明白,连接的建立与关闭是一个一个双向的确认过程 连接:(你可以想象成当你接到一个陌生电话时,确认对方身份的过程) 1、客户端发起连接,会向服务端发送一个带初始序号的SYN帧(这里的SYN就是指将上图红框的SYN位置为1,初始序号就是图中“32位序号”) 2、服务端确认连接,收到客户端发来的SYN帧后,服务端将回发一个新的SYN应答帧,用来确认收到,应答帧中会填入本身的序号,同时将接收到初始序号+1作为确认序号填入,红框的标志位ACK与SYN 都置1 3、客户端接收确认,收到服务端的确认SYN帧时客户端已经算是建立了连接,同时会对接收到确认帧进行确认应答,
这就是tcp建立连接的“三次握手”,表述有点绕,但是可以参考下图上半部分,简单明了,值得一提的是,客户端和服务端都有自己独立帧序号,上图格式中的 “32位序号”指的是本身的序号,“32位确认序号”是指对方发来的序号+1,如下图所示,J代表客户端本身的序号,K代表服务端本身的序号 关闭: tcp连接是全双工的,因此他可以同时收和发,那么关闭也是2个方向的都关闭 1、客户端发起闭自己的发通道,发送一个FIN(上图红框部分FIN置1) 2、服务端接收FIN,回发FIN应答 3、服务端关闭了自己的发通道,发送FIN 4、客户端接收FIN,回发应答 这就是tcp断开连接的“四次握手”,也可以更形象的说成“4次挥手”,关闭了发送端的发也就相当于关闭了接收端的收,因此只需要分别关闭2端的发就可以了 值得一提的是,主动关闭的一方,不会立马就关闭了,而是会有一个超时等待然后关闭的过程,这个过程被称作TIME_WAIT,通常停留 2倍的MSL(Maximum Segment Lifetime),之所以停留一个时间段,是为了确保将最后一个ack能到达对端。这意味的操作系统并不会立马释放它,所以有时候客户端程序退出立马重启时会发现客户端的套接字不可用。 MSL为报文段最大生命周期,RFC 793 [Postel 1981c] 指出MSL为2分钟,通常实现中的常用值是30秒,1分钟,或2分钟,
|