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不提供连接的可靠性和流控制,而是专注于尽可能快速地传输数据

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

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种流行的编程语言,可以用于网络编程。下面是一些常用的Python网络编程的基础知识和技术: 1. socket模块: Python中的socket模块提供了一种用于网络通信的接口,可以用于创建TCP或UDP服务器客户端。 2. TCP服务器: 在Python中,可以使用socket模块创建TCP服务器,可以使用socket.accept()方法等待客户端连接,使用socket.recv()方法接收客户端发送的数据,使用socket.send()方法发送数据给客户端。 3. TCP客户端: 在Python中,可以使用socket模块创建TCP客户端,可以使用socket.connect()方法连接服务器,使用socket.send()方法发送数据给服务器,使用socket.recv()方法接收服务器发送的数据。 4. UDP服务器客户端: 在Python中,可以使用socket模块创建UDP服务器客户端,可以使用socket.recvfrom()方法接收来自客户端的数据,使用socket.sendto()方法将数据发送给客户端。 5. HTTP请求: Python中的urllib模块可以用于发送HTTP请求,可以使用urllib.request.urlopen()方法打开URL,使用read()方法读取响应数据。 6. SMTP邮件: Python中的smtplib模块可以用于发送电子邮件,可以使用smtplib.SMTP()方法连接到邮件服务器,使用sendmail()方法发送邮件。 7. FTP文件传输: Python中的ftplib模块可以用于FTP文件传输,可以使用ftplib.FTP()方法连接到FTP服务器,使用retrbinary()方法下载文件,使用storbinary()方法上传文件。 总之,Python网络编程提供了丰富的API和工具,可以轻松地创建各种网络应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值