计算机网络——传输层

内容主要为课程笔记,课程为 bilibili 湖大教书匠 的[计算机网络微课堂](【计算机网络微课堂(有字幕无背景音乐版)】

概述

之前所学的物理层、数据链路层和网络层实现了主机到主机的通信互联。但实际上真正在计算机中进行通信的是主机中的进程,为主机应用进程提供直接通信服务的正是传输层(或者说运输层)。(运输层协议又称端到端协议)

image

运输层向高层用户屏蔽了下层的细节,对应用进程而言它们好像是在两个运输层实体之间有一条端到端的逻辑通信信道。
根据应用需求不同,运输层为上层(应用层)提供两种运输协议,即面向连接的TCP无连接的UDP

计算机中的进程通过进程标识符PID来标志。而TCP/IP体系中运输层使用端口号来区分应用层的不同进程。(0-65535)
可以理解为IP地址是你的的家庭住址(某栋楼),端口号则是房间号。运输层送快递的时候可以根据你的家庭地址和房间号准确的把快递送到你家里。

传输层常用协议——TCP 和UDP

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。,TCP比UDP多了许多特性,例如超时重传,流量控制,拥塞控制等等。

而UDP则很简单,只负责发送数据包,不关心数据包是否抵达,因此实时性比较好。

UDP(User Datagram Protocol) TCP(Transmission Control Protocal)
无连接:通信双方可直接发送数据 面向连接的:三次握手,通信,四次挥手
UDP支持单播、多播和广播 TCP仅支持单播 一对一通讯
UDP是面向应用报文的:对应用进程交付的报文既不合并也不拆分 TCP是面向字节流的:对应用程序交付的字节流进行编号,传输
不可靠:用户数据报的丢失和误码,UDP并不处理 可靠的:确保不出现传输查重

TCP运输连接有三个阶段

  • 建立TCP连接 三次握手
  • 数据传送
  • 释放TCP连接 四次挥手

TCP报文段首部格式

(老师的图里已经讲的很清晰了)
image

1 TCP建立连接

TCP建立连接的目的

  • 使TCP双方能够明确感知对方存在
  • 使TCP双方能够协商一些参数(Socket:由 IP 地址和端口号组成,最大窗口值,窗口扩大选项等)
  • 使TCP双方能对运输实体资源(例如缓存大小,链接表中的项目等)进行分配。

TCP建立连接的过程 三次握手 (※)

TCP建立连接前,TCP服务端处于监听状态(Listen)

第一次握手 TCP客户端发送连接请求:
  • 客户端发送请求报文段 首部中同步标志位SYN设置为1,表示这是一个请求报文;
  • 序号字段随机赋值seq=x,作为客户进程的初始序号
  • 客户端进入SYN-sent状态(同步已发送状态)。
第二次握手 服务器收到建立连接报文段后,发送确认报文段:
  • 确认报文段首部中同步标志位SYN=1, *确认位ACK=1 表示这是一个确认报文段

  • 初始化进程初始序号seq=y, ack=x+1ack是对客户进程初始序号的确认

  • 服务端进入SYN-rcvd状态(同步已接收)

  • 内核会把该连接存储到半连接队列(存储四元组 TCP序列号 重传计时器)

第三次挥手,客户端收到确认后(进入Established状态),向服务端发送确认报文段:
  • 确认报文段确认位ACK=1表明这是普通报文段;报文段序号为seq=x+1表示seq表示所携带数据的第一个字节在整个数据流中的序号;ack=y+1对服务器进程序号字段的确认
  • 客户端收到确认后 进入Established状态
  • 服务端收到报文段也进入进入Established状态
  • 内核会把连接从半连接队列移除,然后在全连接队列创建新连接(存储四元组 TCP序列号 双方协商的接收窗口,用于流量控制,
    MSS(最大报文段大小,限制单次 TCP 报文的数据长度))

image

为什么要进行三次握手?

  1. 确认双方 “收发能力正常”
    第一次握手:服务器知道 “客户端能发送”(因为收到了SYN),但客户端不知道服务器是否能接收或发送。
    第二次握手:客户端知道 “服务器能接收(收到了自己的SYN)且能发送(自己收到了服务器的SYN+ACK)”,但服务器不知道客户端是否能接收自己的SYN。
    第三次握手:服务器知道 “客户端能接收”(因为收到了确认自己SYN的ACK)。
    至此,双方确认:客户端能发能收,服务器也能发能收,双向通信的基础成立。

  2. 同步双方的初始序号seq
    TCP 数据传输依赖 “字节序号” 保证有序性和去重(每个字节都有唯一序号),而序号的起点(seq)是随机生成的(防止旧报文干扰)。
    三次握手使得双方相互确认初始序号。

只有两次握手可能出现什么状况?

假设两次握手成立:服务器收到SYN后,回复SYN+ACK并直接进入连接状态,等待客户端发送数据。
但此时,服务器并不知道客户端是否收到了自己的SYN+ACK,如果客户端的SYN是 “过期的旧报文”(比如因网络延迟滞留的报文),
旧SYN到达服务器,服务器误以为是新连接,回复SYN+ACK并建立连接,占用端口、缓冲区等资源;
image

2 数据传输中 (建立连接后,为了保证传输的可靠性,TCP主要采取了哪些措施?)

1. 确认与重传机制

确认机制和重传机制 通过 “发送 - 确认 - 重传” 的闭环确保数据不丢失,保证数据的有序性、完整性

当数据丢失(如网络丢包)或损坏(校验和错误)时,重传机制会重新发送丢失的字节(或者报文段),确保数据完整。TCP 的重传机制主要包括超时重传和快速重传。

2 TCP的流量控制

TCP使用以字节为单位的滑动窗口,防止发送方发送速度过快,导致接收方缓冲区溢出而丢失数据。

发送方维护一个发送窗口,发送窗口中前半段是已发送的字节,后半段是等待发送的字节。
发送方发送的报文段的起始序号和字节长度

image

接收方收到报文段后会发送确认报文段,(ack表示确认34之前的字节已按序收到,rwnd表示接收窗口长度)

发送方收到确认报文段后,一般会随之调整滑动窗口(发送窗口)的位置。

image

感觉还是老师视频里讲的明了
【计算机网络微课堂(有字幕无背景音乐版)】 https://www.bilibili.com/video/BV1c4411d7jb/?p=60&share_source=copy_web&vd_source=0a3f7f13ede45276c02cf7397c32c90b

3 TCP的拥塞控制

image

TCP的拥塞控制算法

image

3 TCP释放连接

TCP释放连接的过程

使用TCP客户进程的应用进程通知TCP进程主动关闭TCP连接,释放连接开始。

第一次挥手:TCP客户进程发送连接释放报文段,
  • 客户端进入终止等待1状态
  • 报文段首部中 终止标志位FIN=1,确认位ACk=1 表明这是释放报文段;seq=u,延续自身字节序号,ack=v对上一个收到的信息回应
第二次挥手:TCP服务器进程收到释放报文,会发送一个确认报文段
  • 首部中,确认位ACK=1,表明这是一个普通的确认报文段;seq=v 表示字节序号;确认号ack=u+1 ,然后通知高层应用进程用户准备断开TCP连接

  • TCP 服务端进入关闭等待状态

  • TCP客户进程收到确认报文段进入终止等待2状态

(此时TCP连接处于半关闭状态,即TCP客户进程不会再发送数据了;但此时TCP服务进程如果还有数据要发送,TCP客户进程可以接收;)

第三次挥手:服务端应用进程发送完最后的数据后,通知TCP服务进程释放连接。TCP服务进程发送TCP释放报文段
  • 服务端进入Last-ACK(最后确认状态);

  • 报文段首部中终止位FIN=1,确认位ACk=1 表明这是释放报文段;序列号seq=w 因为中间服务端可能发送了一些字节;确认号ack=u+1

第四次挥手:客户端收到TCP释放报文段后,发送普通确认报文段
  • 然后进入时间等待(time-wait)状态。(首部确认位ACK=1 表明这是普通确认报文段)

  • TCP服务进程收到确认报文段后进入关闭状态(Closed)

  • 而TCP客户进程则需要等2MSL(最长报文端寿命)后才进入关闭状态
    image

为什么客户端第四次挥手后还有个时间等待状态time-wait?

如果第四次挥手所发送的确认报文段丢失,TCP服务端没收到确认报文段会触发超时重传,如果客户端直接进入关闭状态closed,不会进行响应。TCP服务进程就会一直无法进入关闭状态。

TCP中保活计时器的作用

如果客户设备突然出现故障,那么服务端和客户端不能正常四次挥手释放连接,需要服务端检测客户进程状态
image

TCP 本身是操作系统内核中的协议栈实现

TCP 协议栈的运行不需要占用端口号,而 “应用程序”(如浏览器、服务器程序)是用户态的进程,它们通过系统调用(如bind()、connect())使用 TCP 协议进行通信时,必须绑定端口号。
或者更具体的说:
应用程序通过 Socket 接口(如bind()、connect()、send()、recv()等函数)与操作系统内核交互,内核再通过网络协议栈(如 TCP/IP)完成实际的数据传输。

UDP

posted @ 2025-07-24 13:49  浪矢-CL  阅读(20)  评论(0)    收藏  举报