0%

传输层网络协议

传输层网络协议

TCP

基于连接的协议

  • 使用TCP协议之前,先建立TCP连接,形成传输数据通道
  • 采用三次握手方式,是可靠的连接
  • 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:终止位,用来在数据传输完毕后释放连接

三次握手

第一次握手:客户端发送连接请求报文段,ACK=0,SYN=1,并发送一个seq序列号;然后,客户端进入SYN_SENT状态,等待服务器的确认; 此时服务端知道自己的收发能力没问题

第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,由于SYN为1,所以设置ack为x+1(确认序号为收到序号+1);同时,自己还要发送SYN请求信息,将ACK=1,SYN=1,并发送一个新的seq序列号;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; 此时客户端知道自己的收发能力没问题,但是服务端并不知道自己发出去的消息客户端能不能收到,即不知道服务端的发送能力和客户端的接收能力服务端并不知道,所以需要第三次握手

第三次握手:客户端收到服务器的报文段,将ACK=1,SYN=1,然后将ack设置为y+1(确认序号为收到序号+1),向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

完成了三次握手,客户端和服务器端就可以开始传送数据。

四次挥手

第一次挥手:主动关闭方发送一个FIN=1,ACK=1,并设置seq=x,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了,但是,此时主动关闭方还可以接受数据

第二次挥手:被动关闭方收到FIN包后,发送FIN=1,ack设置为x+1(确认序号为收到序号+1),并设置seq=y

第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,发送FIN=1,ACK=1,ack设置为x+1(确认序号为收到序号+1),并设置seq=z,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了

第四次挥手:主动关闭方收到FIN后,发送ACK=1,ack设置为z+1(确认序号为收到序号+1),并设置seq=x+1,给被动关闭方,至此,完成四次挥手

UDP

基于非连接的协议

  • 将数据、源、目的封装成数据包,不需要建立连接
  • 每个数据报的大小限制在64K内
  • 由于无需连接,所以是不可靠的连接
  • 发送数据结束时无需释放资源,速度快