Unix网络编程:第二章 传输层:TCP、UDP和SCTP

2024-03-23 06:58

本文主要是介绍Unix网络编程:第二章 传输层:TCP、UDP和SCTP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第二章 传输层:TCP、UDP和SCTP
2.1 概述
UDP是一个简单的、不可靠的数据报协议
TCP是一个复杂、可靠的字节流协议。
SCTP与TCP类似,是可靠传输协议,但它还提供消息边界、传输级别多宿(multihoming)支持以及将头端阻塞(head-of-line blocking)减少到最小的一种方法。

我们必须了解由这些传输层协议提供给应用进程的服务,这样才能弄清这些协议处理什么,应用进程中又需要处理什么。

TCP的某些特性一旦理解,就很容易编写健壮的客户和服务器程序,也很容易使用诸如netstat等普遍可用的工具来调试客户和服务器程序。

本章主题:
TCP的三路握手
TCP的连接终止序列和TCP的TIME_WAIT状态
SCTP的四路握手和SCTP的连接终止
由套接字提供的TCP、UDP和SCTP缓冲机制

2.2 总图
IPv4 网际协议版本4
IPv6 网际协议版本6.其主要变化是使用128位更大地址以应对因特网的爆发性增长。
TCP 传输控制协议。面向连接,为用户进程提供可靠的全双工字节流。流套接字,关系确认、超 时和重传之类的细节。
UDP 用户数据报协议。无连接协议。数据报套接字。UDP数据报不能保证最终到达它们的目的地。
SCTP 流控制传输协议。
ICMP 网际控制消息协议。ICMP处理在路由器和主机之间流通的错误和控制信息。
IGMP 网际组管理协议。IGMP用于多播。
ARP 地址解析协议。ARP把一个IPv4地址映射成一个硬件地址。
RARP 反向地址解析协议。RARP把一个硬件地址映射成一个IPv4地址。
ICMPv6 网际控制消息协议版本6.
BPF BSD分组过滤器。该接口提供对于数据链路层的访问能力。
DLPI 数据局链路提供者接口。该接口也提供对于数据链路层的访问能力。

2.3 用户数据报协议(UDP)
UDP是一个简单的传输层协议。
应用进程王一个UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报。
该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地。
UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。

如果想要确保一个数据报到达其目的地,可以往应用程序中添置一大堆的特性:来自对端的确认、本端的超时和重传等。

每个UDP数据报都有一个长度。如果一个数据报正确地到达其目的地,那么该数据报的长度将随数据一道传递给接收端应用进程。TCP是字节流协议,没有任何记录边界,与UDP不同。

UDP提供无连接的服务,因为UDP客户与服务器之间不必存在任何长期的关系。

2.4 传输控制协议(TCP)
首先,TCP提供客户与服务器之间的连接。TCP客户先与某个个定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止连接。
其次,TCP提供了可靠性。当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃。
注意:TCP并不保证数据一定会被对方端点接收,因为这是不可能做到的。如果有可能,TCP就把数据递送到对方端点,否则就(通过放弃重传并中断连接)通知用户。这么说来,TCP也不能被描述成是100%可靠的协议,它提供的是数据的可靠递送或故障的可靠通知。

TCP含有用于动态估算客户和服务器之间的往返时间的算法,以便它知道等待一个确认需要多少时间。

TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。
举例来说,假设一个应用写2048字节道一个TCP套接字,导致TCP发送2个分节:两个分节所含数据的序列号分别为1~1024,1025~2048.(分节是TCP传递给IP的数据单元)
如果这些分节非顺序到达,接收端TCP将先根据它们的序列号重新排序,再把结果数据传递给接收应用。
如果接收端TCP接收到来自对端的重复数据(譬如说对端认为一个分节已丢失并因此重传,而这个分节并没有真正丢失,只是网络通信过于拥挤),它可以(根据序列号)判定数据是重复的,从而丢弃重复数据。

再次,TCP提供流量控制。TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据(通告窗口)。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。该窗口时刻动态变化。

最后,TCP连接是全双工的。这意味着在一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接收数据。因此,TCP必须为每个数据流方向跟踪诸如序列号和通告窗口大小等状态信息。

这篇关于Unix网络编程:第二章 传输层:TCP、UDP和SCTP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837499

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)