关于协议
简单来说,协议就是计算机与计算机之前通过网络实现通信事先达成的一种“约定”。这种约定,使不同设备,不同系统之间只有遵循相同的协议才能进行通信。互联网中常用的协议有:IP、TCP、UDP、HTTP,局域网:IPX/SPX等
关于TCP/IP
TCP/IP是一种网络体系结构,也可以叫做“TCP/IP”协议族,它不只是TCP和IP,是IP、TCP、HTTP、FTP等协议的集合(基于TCP/UDP、IP的协议)。
TCP/IP的参考模型
和OSI参考模型联系:
-
物理层
物理层是负责数据传输的硬件层,例如:以太网、电话线等物理设备。主要功能是把电压的高低转化成0、1(比特流)。
-
数据链路层
负责把比特流转换成数据帧传输,例如驱动程序担当是操作系统和硬件的桥梁作用。
-
网络层
负责网络通信中的寻址和路由的选择,将目标数据传送到目标地址。
- IP是跨越网络传送数据包,使整个互联网都能收到数据的协议。使用IP地址作为主机的标识;
- ICMP在IP数据包发送途中发生异常无法到达对端的目标地址是,会向发送端发送一个异常的通知的协议。
- ARP是通过IP地址解析出物理地址(MAC地址)的协议。
-
传输层
主要功能是实现程序之前的通信,运用端口号来区分单个设备多个程序之间的通信。期间用到的协议TCP、UDP。
-
应用层
为应用程序提供服务并规定应用程序中通信相关细节。包括文件传输、电子邮件、远程登录等协议。
传输层的协议
在网络通信过程中,源IP地址和目标IP地址两个因素是识别两端主机。但是,传输层的作用是实现单个设备多个程序之间的通信,因此加入了源端口号,协议号,目标端口号。通过这五个因素“源IP地址、目标IP地址、源端口号、目标端口号、协议号”来确认是否同一个通信。
-
UDP
UDP是一种面向无连接的传输层协议,不会关注数据是否到达对端。多用在数据少或多播、广播通信、视频通信等多媒体领域
- UDP的首部
-
源端口号:表示发送的端口号,字段长16位。该字段是可选项,有时可能不会设置源端口号。没有源端口号的时候该字段的值设置为0,可用于不需要返回的通信中。
-
目标端口号:表示接收端口号,字段长16位。
-
包长度: UDP 首部的长度和 UDP 数据长度之和(单位位字节 )
-
检验和:用来判断数据在传输过程中是否损坏,除了检验UDP首部的源端口号、目标端口号,还包括源IP地址、目标IP地址、协议号(这三个也叫“UDP伪首部”)。原因是识别一个通信必须包括这5大因素,假如UDP伪首部出来问题,极有可能应该收包的应用收不到包。
-
TCP
TCP是一种面向连接的传输层协议,要连接和断开经过“三次握手,四次挥手”,可以保证数据传输的可达,具备可靠性。能处理丢包、传输数据顺序乱的问题,还有通过流控制有效地利用宽度,缓解网络拥堵的作用。
- TCP的首部
-
源端口号:表示发送的端口号,字段长16位。
-
目标端口号:表示接收端口号,字段长16位。
-
序列号:指凡事数据的位置,字段长32位,每发送一次数据就累加一次该数据字节数的大小。序列号是在建立连接时由计算机随机生成的随机数作为初始值,通过SYN包传给接收端。
-
确认应答号:它等于下一次应该接收到的数据的序列号。假设发送端的序列号为 s,发送数据的长度为 l,那么接收端返回的确认应答号也是 s + l。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收。
-
数据偏移:该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,也就是TCP首部的长度。该字段的长度单位为 4 字节,如果没有可选字段,那么这里的值就是 5,表示 TCP 首部的长度为 20 字节。
-
保留:该字段主要为了以后扩展是使用,其长度位4位。一般设置位0,但即使收到的包的在该字段不为0,此包也不会被丢弃。
-
控制位:改字段长度为 8 比特,分别有 8 个控制标志。依次是 CWR,ECE,URG,ACK,PSH,RST,SYN 和 FIN。
- CWR(Congestion Window Reduced):CWR与ECE都用于IP地址首部的ECN字段。ECE标志为1是,则通知对方已将拥堵窗口缩小。
- ECE(ECN-Echo):为1时,通知对方,从对方到这边有网络拥塞的情况。
- URG(Urgent Flag):为1时,表示包中有需要紧急处理的数据。
- ACK(Acknowledgement Flag): 为1时,确认应答的字段变为有效。TCP规定处理最初建立连接是的SYN包之外该为必须设置为1。
- PSH(Push Flag):为1时,表示需要将收到的数据立刻传给上层应用协议。PSH为 0是则不用立即传是先进行缓存。
- RST(Reset Flag):为1时,表示TCP连接中出现一次必须强制断开连接。例如,一个没有被使用的端口即使发来连接请求,也无法进行通信,这时可以返回一个RET为1的包,端口连接。
- SYN(Synchronize Flag):用于建立连接。SYN为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定,建立连接的 双方,序列号和趣儿应答号要保持同步。
- FIN(Fin Flag):为1时,表示今后不会再有数据发送,希望断开连接。通信双方的主机之间通过发送FIN位置为1的TCP段,且每个主机对对方的FIN包进行确认应答以后就可以断开连接。不过,不用马上作出应答,而是等缓存区的所有数据发送完成后再发确认应答。
-
窗口大小:该字段长16位,用于通知从相同TCP首部确认应答号所指位置开始能够接收的数据到小。有一种情况,窗口大小为0时,则表示发送窗口探测,以了解最新的窗口大小。但这个数据必须为1字节。
-
检验和:TCP的校验和与UDP相似,区别在于TCP的校验和无法关闭。
-
紧急指针:该字段为16位,只有在URG控制位为1是才有效。
-
选项:该字段用于提高TCP的传输性能。
- TCP三次握手
TCP握手一般由客户端发起,步骤如下:
- 第一次握手: 客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里,并进入SYN_SEND状态,等待服务器确认.
- 第二次握手: 服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为X+1,服务器进入SYN_RECV状态
- 第三次握手. 客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
为什么是三次握手?
因为TCP的可靠的数据传输,且是全双工通信,在双方进行数据传输前,必须确认双方都可以接收数据。例如:如果是二次握手就建立,当服务端给客户端发送数据时,由于没有第三次的ACK握手,服务端就不确定客户端能否接收到数据同样给客户端发送数据,就会造成资源的浪费。
- 四次挥手
- 客户端主动关闭,向服务端发送FIN包,包首部FIN=1,seq(序列号) = u,进入FIN-WAIT状态。
- 服务端收到客户端的FIN包后,向客服端发送一个ACK包,包首部ACK=1,seq = v,ack = u+1,进入等待关闭状态
- 等服务端的缓存数据全部发送完是向客服端发送一个FIN包,包首部FIN=1,ACK=1,seq=w,ack=u+1,进入Last-Ack状态,等待客户端的回复再关闭。
- 客服端收到服务端的FIN包后,返回一个ACK包,包的首部ACK=1,seq=u+1,ack = w+1,服务端收到ACK后就关闭TCP连接,而客户端进入等待关闭,等待2MSL的时间后没有收到服务端的数据,再关闭连接