目录
一、TCP/IP协议简介
TCP/IP协议是一组不同协议组合在一起构成的协议簇,它定义了电子设备如何连接入因特网,以及数据如何在他们之间进行传输。
二、四层协议模型
应用层 | FTP(文件传输协议) HTTP(超文本传输协议) SMTP(简单邮件传输协议) Telnet(远程登录) SNMP(简单网络管理协议) |
传输层 | TCP(传输控制协议) UDP(用户数据报协议) |
网络层 | IP(网际协议) ICMP(互联网控制报文协议) IGMP(互联网组管理协议) 路由器 ARP(地址解析协议) RARP |
链路层 | 以太网 网桥 |
备注:ARP(地址解析协议)、 RARP分在网络层还是链路层一直有歧义,没有严格要求。
当通过http发起一个请求时,从上到下每层会依次对请求进行封装,加上对应层的头部/尾部信息,最终在链路层生成以太网数据包,然后通过物理介质(常见的有光纤、双绞线、无线电波)传输到对方的主机。
接收到数据包之后,每一层又会对数据包进行一层一层的拆包(分用),每层协议都要去检查报文首部中的协议标识,以确定接收数据的上层协议,最后把应用层数据交给应用程序。
链路层:对电信号0和1进行分组并形成具有特定意义的数据帧,包含MAC地址,然后以广播的形式通过物理介质发送给接收方。(mac地址具有全球唯一性)
网络层:定义ip地址,区分网段,子网内MAC寻址,对于不同子网的数据包进行路由。
传输层:定义端口,标识应用程序身份,实现端口到端口的通信。
应用层:定义数据格式并按照对应的格式解读数据。
总结:链路层定义了主机的身份,即MAC地址, 而网络层定义了IP地址,明确了主机所在的网段,传输层定义了端口,明确了接收数据的应用程序,应用层定义了数据格式并解析。
三、TCP、UDP协议区别
TCP协议
1)连接性:面向连接的,数据发送前需要三次握手建立连接;
2)可靠性:可靠传输,有确认、重传、流量控制、拥塞控制机制,传输的数据无差错、不丢失、不重复,有序到达;TCP报文头里面的序号能保证数据按序到达;报文头里面的确认序号能保证不丢包,确认和重传机制;
3)传输数据:传输的是字节流,TCP将应用程序看成是一连串的无结构的字节流,TCP有一个缓冲,当应用程序传送的数据块太长,可以把它划分短一些再传送,如果应用程序一次只发送一个字节,也可以等待积累有足够多的字节后再构成报文段发送出去;比如发送端发送的数据块包含100个字节,那么发送端可以一次发100字节,也可以分多次发送,接收端可以一次性接收100字节,也可以分多次接收;
4)速度:慢,效率低(由于控制机制耗时);
5)占用资源:占用系统资源高,TCP首部开销20字节;
6)易攻击性:由于有确认、三次握手机制导致容易被DOS、DDOS、CC等攻击;
7)连接对象数量:只能是一对一的点到点传输;
8)适用场合:传输少量数据,对网络通讯质量有要求,典型应用:文件传输,接收邮件、远程登录(要求必须准确,速度可以慢)
UDP协议
1)连接性:无连接的,通信前不需要建立连接;
2)可靠性:不可靠传输,可能丢包,无序到达;
3)传输数据:传输的是报文,一次只能发送一个报文,应用层交给UDP多长的报文,UDP照样发送,既不拆分,也不合并,发多少就接收多少;比如发送端发送的报文包含100个字节,那么接收端就必须一次性接收100字节
4)速度:快,效率高;
5)占用资源:占用系统资源较低,UDP的首部开销小,只有8个字节
6)易攻击性:被攻击的漏洞更少相对更安全;
7)连接对象数量:支持一对一,一对多,多对一,多对多的通信;
8)适用场合:传输大量数据,对网络质量要求不太严格,实时应用,典型应用:QQ聊天、直播、视频、实时游戏、物联网领域(实时性要求必须高,准确性要求不高)
四、TCP协议的三次握手,四次挥手
1、三次握手
指的是建立一个TCP连接,需要客户端和服务端总共发送3个报文,目的是连接服务器的端口,建立TCP连接,并同步连接双方的序列号和确认号,交换窗口大小信息。在socket编程中,客户端执行connect()操作时将触发三次握手。
第一次握手:客户端向服务器发送SYN报文(标志位SYN=1,序列号seq=x),并进入SYN_SENT状态,等待服务器确认;
第二次握手:服务端向客户端发送SYN+ACK(标志位SYN=1,标志位ACK=1,序列号seq=y,确认号ack=x+1)报文,并进入SYN_RCVD状态;
第三次握手:客户端收到服务端的确认后,向服务器发送ACK(ACK=1,seq=x+1,ack=y+1)报文,发送完之后客户端和服务端都进入ESTABLISHED状态,完成三次握手,可以开始传输数据。
缩写说明:
SYN:TCP首部标志位,同步序号,用于建立连接,SYN=1表示发起连接
ACK:TCP首部标志位,表示确认号是否有效,ACK=1表示确认号有效
seq:表示首部序列号,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记,用于保证传输数据的有序性
ack:表示确认号,是对上一个包的序号进行确认的号,ack=seq+1,只有ACK=1时才有效
2、四次挥手
指的是断开一个TCP连接需要客户端和服务端共发送4个报文来确认连接的断开,在socket编程中,这一过程由客户端或者服务端任一方执行close来触发。
第一次挥手:客户端向服务端发送标志位FIN=1报文段,序列号seq=u,客户端进入FIN_WAIT_1状态,表示客户端没有数据要发送给服务端了;
第二次挥手:服务端向客户端发送标志位ACK=1的报文段,确认号ack=u+1,序列号seq=v,表示服务端告诉客户端我确认并同意你的关闭请求,但是我数据可能还没传完还不能关闭,客户端进入FIN_WAIT_2状态,服务端进入CLOSE_WAIT状态;
第三次挥手:服务端向客户端发送标志位FIN=1,ACK=1的报文段,确认号ack=u+1,序列号seq=w,表示服务端告诉客户端我数据传完了,请求关闭连接,服务端进入LAST_ACK状态;
第四次挥手:客户端向服务端发送标志位ACK=1的报文段,确认号ack=w+1,序列号seq=u+1,表示确认关闭连接,并且客户端进入TIME_WAIT状态。服务端收到ACK报文后关闭连接进入CLOSED状态,客户端仍然需要等待2MSL的时间,如果依然没有收到服务端的回复,表示服务端已正常关闭,则客户端关闭连接进入CLOSED状态。
3、疑问
(1)为什么四次挥手最后客户端仍要等待2MSL时间才能关闭连接?
答:1、为了保证客户端发送的最后一个ACK报文能够到达服务端,保证客户端和服务端都能够正常可靠关闭;2、使本连接持续的时间内所产生的所有滞留的报文段都能从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
备注:MSL为报文最大生存时间,是任何报文段被丢弃前在网络内的最长时间。
(2)只有二次握手可以吗?
答:不可以,主要为了防止客户端发送的已失效的连接请求报文段突然又传送到了服务端。如果只有2次握手的话,服务端在误以为客户端又发出一个新的连接请求后,发送确认报文后则建立连接,之后一直等待客户端发送数据,浪费服务器资源。
(3)为什么要四次挥手?三次可以吗?
答:不可以,TCP是全双工通信,服务端收到客户端的FIN关闭请求后,只是表示客户端数据已经发送完毕了,但是此时服务端数据并不一定已经发送完了,客户端仍然可以接收数据,所以服务端收到客户端FIN关闭连接请求后不会立刻关闭连接,需要等数据全部发送完之后才会发送FIN报文告诉客户端我数据也发送完了现在可以关闭连接。