Python 网络编程之TCP详细讲解

【一】传输层

【1】概念

  • 传输层是OSI五层模型中的第四层,负责在网络中的两个端系统之间提供数据传输服务
  • 主要协议包括**TCP(传输控制协议)UDP(用户数据报协议)**

【2】功能

  • **端到端通信:**传输层负责在源和目标主机之间建立、维护和终止通信。
  • 分段和重组: 将上层应用层传递下来的数据进行分段,以适应网络的传输要求,并在目标主机上将这些分段重组成完整的消息。
  • 错误检测与纠正: 提供可靠的数据传输,通过序号、确认和重传等机制实现。

【3】协议

  • TCP(传输控制协议): 提供可靠、面向连接的服务。通过三次握手建立连接,使用序号和确认号来保证数据的可靠传输,还包括流量控制和拥塞控制等机制。
  • UDP(用户数据报协议): 提供无连接、不可靠的服务。适用于对实时性要求较高的应用,如音频和视频传输。UDP较轻量,但不提供数据的可靠性和顺序性。

【4】端口

  • 传输层使用端口来标识不同的应用程序。端口分为源端口和目标端口,用于区分同一主机上的不同应用和区分不同主机上的应用。
  • TCPUDP协议都使用端口号,共有65535个端口号,其中0到1023号为众所周知的端口号,用于标识一些常见的服务。

【二】TCP协议

【1】三次握手

(1)理解过程
  • 握手是为了建立连接,建立连接是建立通道的过程,连接应该是双向的,需要发送请求和同意请求,那么理论上来说至少需要四次沟通交流才能建立连接,那为什么说是三次握手呢?
  • 我们画图来说一说:

请添加图片描述

  • 四次握手过程:
    • time0时,客户端向服务端发送连接请求
    • time1时,服务端收到了客户端发来的连接请求,此时返回同意连接的信息
    • time2时,客户端收到了服务端的同意信息,那么此时客户端向服务端发送信息的通道建成
    • time3时,服务端又需要向客户端发送消息,但是向客户端发送信息的通道并没有建成,所以向客户端发送连接请求
    • time4时,客户端收到连接请求,向服务端发送了同意信息
    • time5时,服务端收到同意信息,那么此时服务端向客户端发送信息的通道建成,双方都可以互相发送消息
  • 网络传输需要时效性,这四次握手中是不是有个很明显的浪费时间过程,服务端同意连接的时候不是也可以发发送连接吗?所以三次握手来了
  • 三次握手过程:
    • time0时,客户端向服务端发送连接请求
    • time1时,服务端收到了客户端发来的连接请求,此时返回同意连接的信息(同意客户端可以向服务端发送信息),但是服务端也需要向客户端发送信息,所以跟着发送了向客户端连接的请求
    • time2时,客户端收到了服务端同意的信息,那么客户端向服务端发送消息的通道建立完成,还看到了服务端的连接请求,所以又向服务端发送了同意连接的信息
    • time3时,服务端收到了同意连接的信息,此时双方就可以互相发送信息了
(2)正式讲解

请添加图片描述

  • 特殊文字说明:

    • SYN表示同步请求,seq表示序列号
    • ACK表示确认通知,ack表示确认号
  • 三次握手的详细步骤

    • 第一次握手:
      • 客户端向服务端发送一个TCP报文,标志位设置为SYN,表示发送连接请求
      • 报文包含一个初始序列号(ISN),用于后续数据的序列化
    • 第二次握手:
      • 服务端接收到客户端的SYN报文后,回复一个TCP报文,标志位设置为SYN和ACK
      • 报文中包含服务端的初始序列号(ISN)和确认号(ACK),确认号是客户端的序列号加一
    • 第三次握手:
      • 客户端接收到服务端的SYN和ACK报文后,向服务端发送一个TCP报文,标志位设置为ACK
      • 报文中的确认号(ACK)设置为服务端的序列号加一,还有收到的确认号当作序列化返还回去
  • 为什么要三次握手

    • 第一次握手是客户端告诉服务端他想建立连接,同时告知自己的初始序列号
    • 第二次握手是服务端收到请求后同意建立连接,并提供自己的初始序列号
    • 第三次握手是客户端收到同意后再次确认,确保双方都正确同步了序列号,连接可以安全建立

【2】四次挥手

(1)理解过程
  • 挥手是断开连接的过程,那么正常来说也应该要有四次挥手,连接的过程中可以时间优化只需要三次即可,那么为什么说是四次挥手呢?
  • 因为在服务端收到要断开的请求时,可以先向客户端发送同意断开的信息,让客户端到服务端的信息通道先关闭;但是此时服务端向客户端发送信息的通道任然可能还有数据信息在传输,此时这个通道是不能关闭的,需要服务端完成向客户端发送的所有内容,才可以关闭这条通道
(2)正式讲解

请添加图片描述

  • 四次挥手详细步骤
    • 第一次挥手:
      • 客户端向服务端发送一个TCP报文,标志位设置为FIN,表示客户端不再发送数据
      • 客户端进入FIN_WAIT_1状态,等待服务端的确认
    • 第二次挥手:
      • 服务端收到客户端发来的FIN报文后,回复一个TCP报文,标志位设置为ACK,确认客户端的FIN
      • 服务端进入CLOSE_WAIT状态,表示接收到了关闭连接的请求
    • 第三次挥手:
      • 服务端向客户端发送一个TCP报文,标志位设置为FIN和ACK,表示服务端也不在发送数据
      • 服务端进入LAST_ACK状态,等待客户端的最后确认
    • 第四次挥手:
      • 客户端接收到服务端的FIN报文后,回复一个TCP报文,标志位设置为ACK,确认服务端的FIN
      • 客户端进入TIME_WAIT状态,等待可能可能出现的延迟报文

【三】UDP协议

  • UDP是一种无连接、简单、轻量级的传输层协议

  • TCP不同,UDP不提供连接的可靠性和流控制,而是专注于尽可能快速地传输数据

  • 适用场景:实时音频和视频传输、在线游戏等

相关推荐

  1. 网络编程练习题(TCP)

    2024-01-16 12:04:03       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-16 12:04:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-16 12:04:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-16 12:04:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-16 12:04:03       18 阅读

热门阅读

  1. 在vue中,切换页面之后如何关闭定时器

    2024-01-16 12:04:03       39 阅读
  2. C#学习笔记3-函数与单元测试

    2024-01-16 12:04:03       22 阅读
  3. Springboot启动后自动退出解决办法

    2024-01-16 12:04:03       34 阅读
  4. Linux中的numactl命令使用详解

    2024-01-16 12:04:03       30 阅读
  5. (程序员专用简历助手)Prompt提示词

    2024-01-16 12:04:03       33 阅读
  6. Linux 安装 Mysql5.7(glibc版)

    2024-01-16 12:04:03       33 阅读