协议
互联网中常用的协议有HTTP、TCP、IP等。
协议的必要性
简单的说,协议就是计算机与计算机之间通过网络信息时,实现达成的一种“约定”。好比一个中国人说汉语一个外国人说英语,使用不同的国家语言进行沟通,那么肯定无法交流;但是如果两个人约定好都说同一个语言,那么就可以互相沟通通信。
协议分为很多种,每一种协议都明确界定了他们的行为规范。
协议分层
TCP/IP协议
TCP/IP是用于网络的通信协议,只有遵守这些规则,计算机之间才能进行通信。这里使用的是“这些”,说明TCP/IP肯定不只是一种协议而已,而是一个集合。
TCP协议属于传输层协议(TCP/IP层从上到下为应用层、传输层、网络层、数据链路层、物理层)。
TCP支持的应用协议主要有:TeInet、FTP、SMTP等;UDP支持的应用层协议主要有NFS(网络文件层)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
TCP/IP协议与底层的数据链路层、物理层无关,这也是TCP/IP的重要特点。
TCP:传输控制协议、可靠的面向连接的协议、传输效率低
UDP:用户数据报协议、不可靠的无法连接的服务、传输效率高
TCP/IP协议族
上文说过TCP/IP并不是一个协议而是一群协议,那么TCP/IP就是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合。
协议的分层
网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,TCP/IP,是一组不同层次上的不同协议的组合。传统上来说TCP/IP被认为是一个四层协议,但是ISO指定了一个国际标准OSI七层协议模型。OSI协议以OSI参考模型为基础界定了每个阶层的协议和每个阶层之间接口相关的标准。
分层的作用
- 应用层:为操作系统或网络应用程序提供访问网络服务的接口。包括:FTP、HTTP
- 表示层:将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。
- 会话层:负责建立和端开通信连接,以及数据的分割等数据传输相关的管理。
- 传输层:管理两个节点之间的数据传输。负责可靠传输。
- 网络层:地址管理与路由选择,在这一层,数据的单位称为数据包。
- 数据链路层:互连设备之间传输和识别数据帧
- 物理层:以“0”、“1”代表电压的高低。
七层通信
发送方由顶层开始由上到下,按照顺序每一层进行传输;每个分层在处理上层发送的数据时,都会加上当前层协议所需的“头部”信息(协议ID,报文头)。接收方自下层往上接收,每个分层都会对接受的数据进行该层协议的头部信息与原内容进行“分离”。最终将发送的数据恢复为原始数据。
传输方式的类
网络通信可根据数据发送方法进行多种分类,分类方法很多。
面向由连接型和面向无连接型
- 面向有连接型
发送数据之前,需要在收发主机之间建立一条通信线路,在通信传输的前后,专门进行建立与断开连接的处理。如果与对端之间无法通信,可避免发送无谓的数据。
- 面向无连接型
报文、帧、数据包等的区别
报文在传输的传输过程中会被不同的封装,分装称为分组、包、帧来传输,封装的方式就是添加一些控制信息组成的首部,那些都是报文头。
- 报文:所属应用层,报文是应用层的数据单元,通常是应用程序之间传输的信息。(报文是用户原始信息,通常不包含头部信息)
- 数据段:所属传输层(TCP),在TCP协议中,应用层的报文在这里被封装称为数据段,包含TCP头部(源端口、目的端口、序列号、确认号),和负载数据(报文原始数据)。(TCP数据段提供可靠的、面向连接的数据传输)【UDP协议中称为数据报,UDP提供的是无连接的,不可靠的传输】
- 数据包:所属网络层,在IP协议中,传输层的数据段或数据被封装成为数据包。IP数据包包括IP头部(源IP地址,目标IP地址,TTL,协议类型)、和负载数据(TCP头部和原始数据及数据段)。(IP数据包负责在不同网络之间进行路由和转发)
- 帧:所属数据链路层,帧包含数据链路层头部(MAC地址)和尾部(CRC校验码)以及负载(IP数据包)。(帧负责在同一个局域网内的设备之间进行数据传输)
- 比特流:所属物理层,帧最终被转换为比特流,通过物理介质。进行传输。(比特流是实际的电信号或光信号,表示二进制数据)
TCP报文
数据包
IP数据包在以太网表头帧负载里面,TCP数据段在IP数据包的负载里面。
TCP首部各字段的意义和作用
TCP首部最小为20字节,分为5行,每行四字节,也就是32位。
- 源端口和目的端口:
- 源端口号:16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。
- 目标端口号:16位目的端口域定于传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。
知名端口号一般位于1-255之间、256-1023的端口通常由Unix系统占用、1024-5000时大多数TCP、IP实现的临时分配。大于5000的一般时给其他服务预留的。
- 序列号:是TCP用序列号对数据包(网络层)进行标记,以便在到达目的端口后重装。如当前的序列号位为s,发送数据长度为l,那么席次发送数据是的序列号为s+l。在建立连接时,计算机通常会生成一个随机的序列号。
- 确认号:占4个字节,表示希望下一个报文段的序列值。TCP的可靠性是建立在每个数据都需要确认收的基础上。
- 数据偏移(四位首部长度):这个字段实际上是指出了TCP报文段的首部长度;长度主要可以指明报文段起始地址和原始数据起始地址的间隔。
- 保留:占6位,置0。
- URG(紧急指针):占两字节,为1时紧急指针才有意义;会把紧急数据插入到报文段数据的最前面。
- ACK(确认):当ACK=1时,确认号有效。为0表示数据段不包含确认信息,确认号被忽略。
- PSH(推送):当PSH=1的时候,表示该报文段高优先级,提醒接收方应尽快推送给接收应用程序。
- RST(复位):当RST=1的时候,表示TCP连接中出现严重错误,需要重新释放缓存空间并重新建立连接。
- SYN(同步):当SYN=1的时候,表明这是一个请求连接报文段。携带SYN的报文段称为“同步报文段”;TCP三次握手中的第一次发送的就是同步报文段,用来同步序号。
- FIN(终止):到FIN=1表示此报文段发送完毕,可以释放TCP连接。
- 窗口大小:占16位两字节,明确指出了现在允许对方发送的数据量。
- 校验和:占2个字节,检测TCP传输过程是否损坏。
- 紧急指针:当URG=1的时候,才有意义。指出紧急数据的字符数。指出紧急数据的末尾在报文段中的位置。
三次握手,四次握手
一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂。
- 主机A向主机B发送连接请求数据包“我现在可以给你发送数据了吗?”
- 主机B向主机A发送同意连接并要求同步(同步就是两台主机一个在发送,另一个在接收,协同工作)
- 主机A向主机B再发送一个数据包,确认主机B要求的同步”我现在就开始发了,你接着吧“
经过三次之后,主机A才可向主机B正式发送数据。
四次握手,释放连接
当主机A有没有东西要发送的时候,就要释放A这边的连接,A会发送一个报文,其中FIN=1;服务器B收到后会给应用程序一个信号,这是A端的连接已经关闭。A收到B的确认后进入等待状态,等待B请求释放连接,B数据发送完全后就向A请求连接释放,此时也是FIN=1,并且ack=u+1;A收到后恢复一个确认信息,并进入TIME_WAIT状态,等待2MSL时间。
为什么连接时三次握手,释放确实四次握手
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文。