看一遍忘一遍的网络七层模型与TCP/UDP,重新总结出来( 二 )


看一遍忘一遍的网络七层模型与TCP/UDP,重新总结出来

文章插图
 
可以看到,TCP数据报的头部中不仅包含了源端口号和目的端口号,还包含了序号、确认序号、首部长度、标志位等等信息,总的来看,除去真正的数据部分,头部信息占用的字节数就达到了192字节,当然,这么多字段主要的作用是为了实现TCP面向连接的可靠性传输的功能 。如下则是UDP数据报的格式:
看一遍忘一遍的网络七层模型与TCP/UDP,重新总结出来

文章插图
 
可以看到,这里UDP的数据包格式相对于TCP就非常的精简了,其头部主要就只有源端口号、目的端口号、长度和校验和字段,这些总共占用的字节数是8个字节 。这也就是UDP协议传输速率非常快的另一个原因 。
2. 三次握手和四次挥手
TCP是一个提供可靠传输服务、面向连接的的传输层协议,其可靠性保证主要是通过每次数据报发送时的ACK机制实现的,而其连接的建立和释放则主要是通过三次握手和四次挥手的方式实现的 。如下是其三次握手和四次挥手的过程:
看一遍忘一遍的网络七层模型与TCP/UDP,重新总结出来

文章插图
 
对于三次握手,其整体过程如下:
  • 首先客户端会发送一个建立连接的请求,其标志位中会带上SYN=1, seq=x,这里的SYN=1根据前面TCP头部信息的讲解中我们知道,其表示建立连接的请求,而seq=x则只是当前请求的一个序号,不同的请求是有不同的序号的,加这个序号的原因也是为了将其与服务端的响应请求关联起来;
  • 在服务端接收到客户端建立连接的请求之后,其就会返回SYN=1, ACK=1, seq=y, ack_seq=x+1,这里的SYN=1, ACK=1表示的是对客户端建立连接的请求的同意响应,seq=y则标识了这是服务端的一次数据发送,而ack_seq=x+1则表示其是对客户端的seq=x的请求的一个响应;
  • 在客户端接收到服务端的响应的时候,客户端就能够确认服务端是能够正常接收和发送数据的,而服务端在接收到客户端的第一次请求的时候也能够确认客户端能够正常的发送请求 。这个时候,客户端就会发送一个ACK=1, seq=x+1, ack_seq=y+1给服务器,服务器接收到后就会完成连接的建立 。
可以看到,前两次请求都是建立连接所必要的,而客户端要发送第三次请求的原因主要有两点:
  • 可以让服务器确保客户端是能够正常发送和接收请求的;
  • 由于连接的建立是在不稳定的网络上进行的,因而这里有可能第一次请求是由于客户端在某个时间点发送的,但是由于网络延迟,导致很久之后服务器才接收到该请求,但此时服务器并不知道这个连接建立的请求是否是正常请求,其还是会正常发送一个同意建立连接的响应给客户端,如果第一请求是由于网络延迟造成的,那么客户端是不会再发送第三次握手给服务器的,这个时候服务器等待超时后也就不会建立这一次的连接了 。
对于四次挥手,其是在客户端与服务器交互完成之后,由客户端发起的 。四次挥手的主要流程如下:
  • 客户端首先会发送一个FIN=1, seq=u给服务器,根据前面TCP头部信息的讲解,我们知道FIN=1表示这是一个断开连接的请求,而seq=u则标识了这次请求的一个序号;
  • 服务器接收到客户端的断开连接的请求后,其就会向客户端发送一个ACK=1, seq=v, ack_seq=u+1的响应,这里的seq=v还是表示当前请求的序号,而ack_seq=u+1则表示这是对客户端发送的seq=u的断开连接的请求的响应,但是需要注意的是,这个请求并不表示服务器同意断开连接,此时还只是一个半关闭的状态,因为此时服务器可能还有数据在进行处理没有发送给客户端,此时服务器就会完成这些断开连接的工作;
  • 待服务器完成了断开连接的准备工作之后,其就会给客户端发送一个FIN=1, ACK=1, seq=w, ack_seq=u+1的响应,注意,这个过程中客户端一直都处于等待状态的 。这里相对于前一次响应,多了一个FIN=1,就是表示当前是确认断开连接的请求;
  • 客户端在接收到服务器的响应之后,其就会给服务器发送一个ACK=1, seq=u+1, ack_seq=w+1的响应,表示同意断开连接,服务器接收到后就会断开连接,而客户端则会等待一小段时间后自行断开连接 。
3. 小结
本文首先讲解了OSI网络七层模型,详细讲解了模型中每一层的作用,然后讲解了传输层中TCP和UDP的主要区别,从传输方式和传输数据格式上对两种协议进行了对比,最后讲解了TCP协议中三次握手和四次挥手的主要过程,并且详细讲解了每一步的作用 。


推荐阅读