计算机网络 —— 传输层详解

本文详细介绍了计算机网络的传输层,重点讲解了TCP和UDP协议。TCP协议提供了面向连接、可靠传输的服务,通过三次握手建立连接,四次挥手断开连接,确保数据的有序和完整。而UDP协议则无连接、不可靠,适用于对实时性要求高的场景。此外,还探讨了端口号划分、粘包问题、滑动窗口机制和拥塞控制等关键概念。
摘要由CSDN通过智能技术生成

端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序;

在TCP/IP协议中,
通过 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信。

额外要注意的是一个端口只能bind一个进程,然后一个进程可以bind多个端口号。
进程就像是人,端口号就像是手机,一个手机只能被一个人用来通信,然后一个人却可以同时使用多个手机及进行通信。

端口号划分

  • 0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.
  • 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的

注意 平时写程序使用端口时候要避开这些知名端口好,以免发生冲突。
该命令用于查看知名端口号

cat /etc/services

UDP协议

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP
数据包的方法。

UDP协议格式

源端端口 对端端口
数据报长度 校验和
数据 数据(报头8字节 (2字节 * 4)数据不超64k-20-8)

格式解析

  • 16位源端端口和对端端口 : 描述端与端之间的通信
  • 数据报长度:限制了UDP报文的总长度(64K)
  • 校验和:采用二进制反码求和算法,确保数据收发无误
  • 数据:发送的数据
  • 二进制反码求和简介: 从报文开始的每个字节进行取反相加,高出16位截断高位, 与低16位继续相加,得到校验和。

UDP协议特性解析

无连接,不可靠,面向数据报

  • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接
  • 不可靠: 传输层不保证数据安全有序到达对面 (程序员在应用层进行包序管理)
  • 面向数据报: 有最大小限制的传输方式 数据大小不能大于64k-8-20字节

UDP其他注意事项

  1. udp的数据传输是整条交付的,因此缓冲区要足够大(64k即可)。
  2. sendto将数据放入缓冲区之后直接封装头部,进行发送。
  3. recvfrom总是接收一条完整的数据不能接收半条或者多条(否则报错)。
  4. 由于udp不进行包序管理因此数据分包发送时需要程序员在应用层进行分包操作。

UDP不粘包

发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据。

也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据, 这一点和TCP是很不同的。怎样定义消息呢?可以认为对方一次性write/send的数据为一个消息,需要明白的是当对方send一条信息的时候,无论底层怎样分段分片,TCP协议层会把构成整条消息的数据段排序完成后才呈现在内核缓冲区。

UDP使用注意事项

我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首 部). 如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。

基于UDP的应用层协议(了解)

  • NFS: 网络文件系统
  • TFTP: 简单文件传输协议
  • DHCP: 动态主机配置协议
  • BOOTP: 启动协议(用于无盘设备启动)
  • DNS: 域名解析协议

当然, 也包括你自己写UDP程序时自定义的应用层协议;

TCP协议

TCP协议格式

协议格式如图所示:
在这里插入图片描述
协议解析

  • 16位源端端口号/16位对端端口号: 描述的端与端之间的通信。
  • 32位序号/32位确认序号: 实现的tcp的包序管理——数据总是有序交付给上层
  • 4位头部长度: 以四字节为单位描述tcp报头长度(tcp包头最小20 最大 60byte)
  • 六位保留:
  • 六位标志位:
    URG:紧急指针(urgent pointer)有效。
    ACK:确认序号有效。
    PSH:接收
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值