一、协议分层
TCP/IP 在数据包设计上采用封装和分用的策略,所谓封装就是在应用程序在发送数据的过程中,每一层都增加一些首部信息,这些信息用于和接收端同层次进行沟通,例如当数据从应用程序发送到以太网过程中数据逐层加工的示意图如下所示:
1、应用层
应用层做为 TCP/IP 协议的最高层级
运行在 TCP 协议上的协议:
HTTP(Hypertext Transfer Protocol,超文本传输协议)主要用于普通浏览。
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer, or HTTP over SSL,安全超文本传输协议)HTTP 协议的安全版本。
FTP(File Transfer Protocol,文件传输协议) 由名知义,用于文件传输。
POP3(Post Office Protocol, version 3,邮局协议)收邮件用。
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)用来发送电子邮件。
TELNET(Teletype over the Network,网络电传) 通过一个终端(terminal)登陆到网络。
SSH(Secure Shell,用于替代安全性差的 TELNET)用于加密安全登陆用。
运行在 UDP 协议上的协议:
BOOTP(Boot Protocol,启动协议) 应用于无盘设备。
NTP(Network Time Protocol,网络时间协议)用于网络同步。
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)动态配置 IP 地址。
其他:
DNS(Domain Name Service,域名服务)用于完成地址查找,邮件转发等工作(运行在 TCP 和 UDP 协议上)。
ECHO(Echo Protocol,回绕协议) 用于查错及测量应答时间(运行在 TCP 和 UDP 协议上)。
SNMP(Simple Network Management Protocol,简单网络管理协议)用于网络信息的收集和网络管理。
ARP(Address Resolution Protocol,地址解析协议)用于动态解析以太网硬件的地址。
2、传输层
传输层提供了两种到达目标网络的方式:
(1)用户数据报协议 UDP:
只提供了基本的错误检测,是一个无连接的协议。
特点:把数据打包,数据大小有限制(64k),不建立连接,速度快,但可靠性低。
(2)传输控制协议 TCP:
提供了完善的错误控制和流量控制,能够确保数据正常传输,是一个面向连接的协议。
特点:建立连接通道,数据大小无限制速度慢,但是可靠性高。由于传输层涉及的东西比较多,比如端口,Socket 等。
TCP 三次握手
**第一次握手:**Client 将标志位 SYN 置为 1,随机产生一个值 seq=J,并将该数据包发送给 Server,Client 进入 SYN_SENT 状态,等待 Server 确认。
**第二次握手:**Server 收到数据包后由标志位 SYN=1 知道 Client 请求建立连接,Server 将标志位 SYN 和 ACK 都置为 1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给 Client 以确认连接请求,Server 进入 SYN_RCVD 状态。
**第三次握手:**Client 收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给 Server,Server 检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,Client 和 Server 进入 ESTABLISHED 状态,完成三次握手,随后 Client 与 Server 之间可以开始传输数据了。
简单来说,就是:
**(1):**建立连接时,客户端发送 SYN 包(SYN=i)到服务器,并进入到 SYN-SEND 状态,等待服务器确认
**(2):**服务器收到 SYN 包,必须确认客户的 SYN(ack=i+1), 同时自己也发送一个 SYN 包(SYN=k), 即 SYN+ACK 包,此时服务器进入 SYN-RECV 状态
**(3):**客户端收到服务器的 SYN+ACK 包,向服务器发送确认报 ACK(ack=k+1), 此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手,客户端与服务器开始传送数据。
TCP 四次挥手
由于 TCP 连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个 FIN 来终止这一方向的连接,收到一个 FIN 只是意味着这一方向上没有数据流动了,即不会再收到数据了。
但是在这个 TCP 连接上仍然能够发送数据,直到这一方向也发送了 FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
**第一次挥手:**Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态。
**第二次挥手:**Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号 + 1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。
**第三次挥手:**Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。
**第四次挥手:**Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号 + 1,Server 进入 CLOSED 状态,完成四次挥手。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。
而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了。
所以己方可以立即 close,也可以发送一些数据给对方后,再发送 FIN 报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN 一般都会分开发送。
3、网络层
IP 地址由两部分组成,即网络地址和主机地址,二者是主从关系:
(1)网络号 net-id,它标志主机(或路由器)所连接到的网络,网络地址表示其属于互联网的哪一个网络
(2)主机号 host-id,它标志该主机(或路由器),主机地址表示其属于该网络中的哪一台主机。
二、协议拆分
类似地,许多应用进程使用 TCP 或 UDP 传送数据,则需要在 TCP 段或 UDP 数据报首部定义一个应用程序标识符。
TCP 和 UDP 都使用一个 16 位的端口号来标识不同的应用程序,TCP 和 UDP 把 “源端口号” 和“目的端口号”分别存人 TCP 段首部 UDP 数据报首部。
网络接口分别发送和接收 IP、ARP、RARP 的数据,同理,也必须在以太网 (假定物理网络是一个以太网) 的首部加入一个字段,用来说明是哪个协议的数据。
为此,以太网帧首部定义了一个 16 位的 “类型” 字段。当接收方 (也称目的主机) 收到一个以太网帧时,数据就开始在协议栈中自下而上传送。
各层协议利用报文首部所携带的协议控制信息做相应的处理,然后去掉各层协议数据单元的首部,将封装的数据交给上层协议。
每层协议都要检查协议首部中的协议标识,以确定让哪一个协议接收数据,这个过程称为拆封,如上图所示。
三、局域网数据传输
任何两个对等层 (peerlayer),例如传输层、网际层、网络接口层之间的通信,如同上图中标识的一样,好像是将数据通过水平虚线直接传递给对方,这就是所谓的对等层之间的通信。
实际上,协议就是在两个对等层之间传递数据时的各种规定。
由此可以这样认为:实际通信是按垂直方向进行的,层与层之间经过封装和拆封这样的操作实现物理通信。但是逻辑上,却是在水平方向上利用协议进行的对等层通信。
四、广域网数据传输
应用层和传输层使用端到端 (end-to-end) 协议,路由器中没有这两层协议,只有端系统才有这两层协议。
网际层是逐跳 (hop-by-hop) 协议,端系统和路由器都有网际层协议。
一个路由器具有两个或多个网络接口,这样才能连接两个或多个网络。互联网的目的之一是在应用程序中屏蔽所有的物理网络细节。
在上图中,应用层不需要关心一个端系统是在以太网上还是在令牌环网上,它们通过路由器进行通信。
随着不同类型物理网络的增加,互联网的规模变得越来越大,也需要增加路由器,但是应用层仍然是一样的。