一、通信模型
计算机与网络设备相互通信时,双方必须约定好怎么通信。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。
开放式系统互联通信参考模型(Open System Interconnection Reference Model,缩写为OSI),简称OSI模型,将计算机网络体系结构划分为以下七层:
- 物理层:将数据转换为可通过物理介质传送的电子信号,相当于邮局中的搬运工人。
- 数据链路层:决定访问网络介质的方式。在此层将数据分帧,并处理流控制。本层指定拓扑结构并提供硬件寻址,相当于邮局中的装拆箱工人。
- 网络层:使用权数据路由经过大型网络,相当于邮局中的排序工人。
- 传输层:提供终端到终端的可靠连接,相当于公司中跑邮局的送信职员。
- 会话层:允许用户使用简单易记的名称建立连接,相当于公司中收寄信、写信封与拆信封的秘书。
- 表示层:协商数据交换格式,相当公司中简报老板、替老板写信的助理。
- 应用层:用户的应用程序和网络之间的接口。
TCP/IP是一系列网络协议的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP等都属于TCP/IP族内的协议。TCP/IP模型是互联网的基础,这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。
- 链路层:负责封装和解封装IP报文,发送和接收地址解析协议(ARP)/逆向地址解析协议(RARP)报文等。
- 网络层:负责路由以及把分组报文发送给目标网络或主机。
- 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
- 应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
OSI七层模型 | TCP/IP模型 | 功能 | 包含协议 |
---|---|---|---|
物理层 | 链路层 | 以二进制数据形式在物理媒介上传输数据 | ISO2110,IEEE802,IEEE802.2 |
数据链路层 | 传输有地址的帧以及错误检测功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU | |
网络层 | 网络层 | 为数据包选择路由 | IP,ICMP,RIP,OSPF,BGP,IGMP |
传输层 | 传输层 | 提供端对端的接口 | TCP,UDP |
会话层 | 应用层 | 解除或建方与别的接点的联系 | 没有协议 |
表示层 | 数据格式化,代码转换,数据加密 | 没有协议 | |
应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
在网络体系结构中网络通信的建立必须是在通信双方的对等层进行,不能交错。 在整个数据传输过程中,数据在发送端经过各层时都要附加上相应层的协议头,数据链路层还需要封装协议尾。也就是说要对数据进行协议封装,以标识对应层所用的通信协议。
二、TCP:
是Transmission Control Protocol的简称,中文名是传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议。由IETF的RFC793定义。
1、TCP的连接过程(三次握手):
第一次握手:客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入SYN-SENT状态。
第二次握手:服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入SYN-RECEIVED状态。
第三次握手:当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED 状态,此时连接建立成功。
2、TCP的断开过程(四次挥手):
第一次挥手:当客户端认为数据发送完成时,它会向服务端发送连接断开请求,告诉服务端不会再发送数据。
第二次挥手:服务端收到客户端的连接断开请求后,会告诉应用层要释放链接。然后会发送ACK包给客户端,并进入 CLOSE_WAIT状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据。但是因为TCP连接是全双工的,所以 服务端仍旧可以发送数据给客户端。
第三次挥手:如果此时服务端还有数据没有给客户端发完则会继续发送,如果发送完毕则会向客户端发送连接断开请求,然后服务端便进入LAST-ACK状态。
第四次挥手:客户端收到服务端的断开请求后,向服务端发送确认应答,此时客户端进入TIME-WAIT 状态。该状态会持续 2MSL(MSL是Maximum Segment Lifetime英文缩写,中文译为“报文最大生存时间”) ,若该时间段内没有服务端的重发请求,就进入 CLOSED 状态。当服务端收到客户端的确认应答后,也进入CLOSED状态。
TCP有如下特点:
- 面向连接的
发送数据之前必须在两端建立连接,建立连接的方法是“三次握手”,这样能建立可靠的连接。
- 仅支持单播传输
每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。
- 面向字节流
TCP是在不保留报文边界的情况下以字节流方式进行传输。头部最少20个字节,最大60个字节。
- 传输可靠
判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端时包的按序接收。当接收端成功收到字节时会给发送端发回一个相应的确认(ACK);如果发送端在合理的往返时延(RTT,是Round-Trip Time的英文缩写)内未收到接收端发回的确认,那么对应的数据(假设丢失了)将会被重新发送。
-
拥塞控制
当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞。
三、UDP:
是User Datagram Protocol的简称, 中文名是用户数据报协议。是一种无连接的协议,也就是说,当报文发送之后是无法得知是否安全完整地被接收到。它有以下特点:
- 面向无连接
UDP是不需要和TCP一样在发送数据前进行三次握手建立连接的,想发数据就开始发送了。并且也只是对数据报文的搬运,不会对数据报文进行任何拆分和拼接操作。具体来说就是:
1>在发送端,应用层将数据传递给传输层的UDP协议,UDP只会给数据增加一个UDP协议头标识是UDP协议,然后就传递给网络层了;
2>在接收端,网络层将数据传递给传输层,UDP只去除IP报文头就传递给应用层,不会任何拼接操作。
- 有单播,多播,广播的功能
UDP不仅支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说UDP提供了单播,多播,广播的功能。
- 面向报文
UDP对应用层传过来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文。
- 高效
头部开销小,仅需8个字节,传输数据时是很高效的。UDP头部包含了以下几个数据:
1>两个16位的端口号,分别为源端口(可选字段)和目标端口;
2>整个数据报文的长度;
3>整个数据报文的检验和IPv4(可选字段),用于发现头部信息和数据中的错误;