传输层网络协议
TCP
基于连接、可靠的协议
- 使用TCP协议之前,先建立TCP连接,形成传输数据通道
- 采用三次握手方式,是可靠的连接,会向对方确认是否成功送达,握手过程中使用了TCP的标志 SYN和ACK
- TCP协议进行通信的两个应用进程:客户端、服务端
- 在连接中可进行大数据量的传输
- 面向字节流的协议,可能会对原始数据进行合并或者分拆(粘包和拆包问题)
- 传输完毕,需释放已建立的连接,效率低
包含了两个序号和三个标志位
两个序号
- seq:sequence number的缩写,表示所传数据的序号,TCP传输时每一个字节都有一个序号,发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接收完整了,如果没接收完整就需要重新传送,这样可以保证数据的完整性
- ack:acknowledge number的缩写,表示确认号,接收端用它来给发送端反馈已经成功接收到的数据信息,值为希望接收的下一个数据包起始序号,也就是ack值所代表的的序号前面的数据已经成功接收到了
三个标志位
- ACK:确认位,只有ACK=1的时候ack才起作用,正常通信时ACK为1,第一次发送请求时因为没有需要确认的数据所以ACK为0
- SYN:同步位,用于在建立连接时同步序号,刚开始建立连接时并没有历史接收的数据,所以ack没有办法设置,这时按照正常的机制就无法运行,SYN的作用就是用来解决该问题的,当接收端收到SYN=1的报文时就会直接将ack设置为接收到的seq+1的值,因为通信双方的ack都需要设置一个初始值,所以SYN在前两次握手时都为1
- FIN:终止位,用来在数据传输完毕后释放连接
三次握手
第一次握手:客户端发送一个带有SYN标识的连接请求报文段,并发送一个seq序列号;然后,客户端进入SYN_SENT状态,等待服务器的确认; 用于询问服务器是否可以接收,此时服务端知道自己的接收能力没问题
第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置ack为x+1(确认序号为收到序号+1);并发送一个新的seq序列号;服务器端将上述所有信息放到一个报文段(即带有SYN+ACK标识的报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; 此时客户端知道自己的收发能力没问题,但是服务端并不知道自己发出去的消息客户端能不能收到,即不知道服务端的发送能力和客户端的接收能力服务端并不知道,所以需要第三次握手
第三次握手:客户端收到服务器的报文段,将ack设置为y+1(确认序号为收到序号+1),向服务器发送带有ACK标识报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据。
简单来说就是,发送端首先发送一个带SYN标志的数据包给对方;接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息;发送端收到之后再回传一个带ACK标志的数据包,表示握手结束
四次挥手
由于TCP连接时全双工的,因此每个方向都要单独进行关闭,发送FIN标识的报文表示该方向没有数据流动了
第一次挥手:主动关闭方发送一个FIN和ACK标识的报文,并设置seq=x,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了,但是,此时主动关闭方还可以接受数据
第二次挥手:被动关闭方收到FIN包后,发送ACK标识的报文,ack设置为x+1(确认序号为收到序号+1),并设置seq=y
第三次挥手:被动关闭方发送一个FIN和ACK标识的报文,用来关闭被动关闭方到主动关闭方的数据传送,ack设置为x+1(确认序号为收到序号+1),并设置seq=z,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了
第四次挥手:主动关闭方收到FIN后,发送ACK标识的报文,ack设置为z+1(确认序号为收到序号+1),并设置seq=x+1,给被动关闭方,至此,完成四次挥手
连接状态
- CLOSING: 客户端发送了FIN,但是没有收到服务器的ACK,却收到了服务器的FIN,这种情况发生在服务器发送的ACK丢包的时候,因为网络传输有时会有意外。
- LISTEN:等待从任何远端TCP 和端口的连接请求。
- SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
- SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
- ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
- FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
- FIN_WAIT_2:等待远端TCP 的连接终止请求。
- CLOSE_WAIT:等待本地用户的连接终止请求。
- CLOSING:等待远端TCP 的连接终止请求确认。
- LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
- TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。TIME_WAIT 两个存在的理由:可靠的实现tcp全双工连接的终止;允许老的重复分节在网络中消逝。
- CLOSED:不在连接状态
UDP
基于非连接的协议
- 将数据、源、目的封装成数据包,不需要建立连接
- 每个数据报的大小限制在64K内
- 面向报文传输的,不会对报文进行任何处理
- 由于无需连接,所以是不可靠的连接
- 没有拥塞控制,不管网络是否拥塞
- 发送数据结束时无需释放资源,速度快