TCP和UDP

107 阅读5分钟

OSI模型和TCP/IP模型

OSI和TCP/IP都是负责为用户提供真正的端对端的通信服务,也对高层屏蔽了底层网络的实现细节。OSI更全面,更能概括。TCP/iP更实用,高效

  1. OSI分7层,OSI是制定的适用于全世界计算机网络的统一标准,是一种理想状态,它结构复杂,实现周期长,运行效率低。
  2. TCP/IP分4层,独立于特定的计算机硬件和操作系统,可移植性好,独立于特定的网络硬件,可以提供多种拥有大量用户的网络服务,并促进Internet的发展,成为广泛应用的网络模型。

TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。

tcp协议

TCP报头结构

  1. 序列号seq: 建立连接时由计算机生成一个随机数,通过SYN传给接收端,接收端要累加 【数据字节数】, 用来解决网络包乱序的问题。
  2. 确认应答号ack:表示下一次期望接收到的序列号,表示前面的序列号已经正常接收,用来解决不丢包的问题
  3. 控制位
    1. ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建⽴连接时的 SYN 包之外该位必须设置为 1;
    2. RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接;
    3. SYN:该位为 1 时,表示希望建⽴连接,并在其「序列号」的字段进⾏序列号初始值的设定。
    4. FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双⽅的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。

三次握手

初始状态:客户端CLOSED状态,服务器LISTEN状态。

第一次握手: 客户端初始化随机的序列号client_isn,发送报文

控制位:SYN=1 序列号:seq = client_isn ,状态: CLOSED -> SYN-SENT

第二次握手: 服务端收到SYN包后,初始化服务器的序列号,发送报文

控制位:SYN=1,ACK=1 序列号:seq = server_isn ,应答确认号:client_isn+1 状态: LISTEN -> SYN-RCVD(半连接队列)

第三次握手: 客户端接收ACK+SYN报文,发送报文:

控制位:ACK=1 序列号:seq = client_isn+1 , 应答确认号:ack=server_isn+1 状态: LISTEN -> ESTABLISHED

服务端收到ACK报文后:开始数据传输

状态: SYN-RCVD -> ESTABLISHED , 半连接队列 -> 全连接队列

握手异常情况:

第一次握手SYN丢包:超时重发(默认5次,超时重传时间每次翻倍)

第二次握手SYN+ACK丢包:服务端回了SYN+ACK包(丢失了),客户端没有收到超时重发SYN包(多次),服务端没有收到客户端的ACK也超时重发(多次),服务器随时收到第一次握手的SYN包会回复SYN+ACK包,会重置超时定时器。

第三次握手ACK丢包: 服务端收不到ACK包,重发SYN+ACK包,超次数后会主动终止连接。但客户端已经是 ESTABLISHED 状态 ,客户端的数据报文一直在超时重传, 默认15次,时间一直翻倍,最后客户端才会报错退出。

假如客户端不发数据,就不用等待数据回应,怎么才会断开处于 ESTABLISHED 状态的连接? tcp保活机制:每隔一段时间发送一个数据量非常小的 {探测报文},连续几个没有收到响应,就会报错断开

为什么是三次握手

  1. 双方可以同步对方的序列号: 可以去除重复数据,使数据变的有序,可以确认数据不丢包ack,确保数据顺序,防止重发的的SYN包重复建立连接

  2. 互相确认的对方的接受/发送能力

四次挥手

任何一方都可以主动关闭连接,

初始状态:双方ESTABLISHED ,假如客户端想要断开

一次挥手:客户端停止发送数据,发送FIN包

控制位:FIN=1 序列号:seq=u 状态:ESTABLISHED -> FIN-WAIT-1 (等待远程中断请求)

二次挥手:服务端接受FIN包,发送ACK包 ,进行发包发送数据

控制位:ACK=1 序列号:seq=v 应答号 ack=u+1 状态:ESTABLISHED -> CLOSE-WAIT (等待本地中断请求)

客户端:接受到ACK包,继续接收数据

状态:FIN-WAIT-1 -> FIN-WAIT-2 (等待远程中断请求)

三次挥手:服务端发送完剩余数据,开始断开连接,发送FIN+ACK包

控制位:FIN=1 ACK=1 序列号:seq=w 应答号 ack=u+1 状态:CLOSE-WAIT -> LAST-ACK

四次挥手:客户端收到FIN+ACK包,发送ACK包应答,等待2MSL后端断开连接

控制位:ACK=1 序列号:seq=u+1 应答号 ack=w+1 状态:FIN-WAIT-2 -> TIME-WAIT (2MSL) -> CLOSED

问题:为什么四次挥手

TCP是全双工的,客户端单方面发送数据完请求断开,但服务端可能还有数据未发送完。

问题:为什么等2MSL时间

  1. 为了确保服务端收到应答,假如客户端的ACK包丢失,服务端会重发FIN+ACK包,客户端会重新收到(重置2MSL时间)。
  2. 防止旧连接的数据包,(有相同端口的 TCP 连接被复用后就可以接受的数据),MSL后就可以保证使TCP报文消失在网络中。

MSL Maximum Segment Life 报文在网络存活时间 ,linux默认30秒

TCP和UDP的区别

TCP就像打电话,双方确认连接才发送数据,UDP就像发短信

TCP:面向连接,较耗字段,面向字节流,保证数据顺序,完整,全双工,可以重发,有缓冲。

UDP:面向报文,速度快,支持多对多,不保证数据完整