浅谈传输层

1. 传输层的作用

在传输层中有两个特别重要的协议 TCP/UDP .
以快递员送快递为例说明这个问题吧. 在进行包裹传输的过程中快递员需要根据快递上的目的地址(目的计算机)来投递包裹(IP数据报), 加入在快递单上只写了收件人的所在地, 所在单位, 而只写了收件人的姓没有写收件人的名字, 此时包裹(数据报)就不知道应该发送给谁, 因此在进行包裹收发的过程中必须写上收件的详细名字(应用程序), 此时的收件人的名字就相当于端口号.因此端口号是用来表示一个主机上进行通信的不同应用程序的编号. 其中 IP 数据报分为源 IP 目的 IP 源端口号 目的端口号以及有效载荷

2. 通信处理

TCP / IP 的众多应用程序都是以客户端服务器端进行运行. 其中 的客户端相当于客户, 而服务器端是用来提供服务的. 作为服务器端的程序必须要先启动随时等待客户的接入. 其中的服务进程都是守护进程. 在确认一个请求究竟是那个服务端发来的, 此时可以通过收到数据报的端口号进行判断.

3. 两种协议 TCP/UDP

(1)TCP

TCP是面向连接有可靠性的面向字节流的协议. 其中的字节流表示数据在发送的时候一次可以发送一个数据报, 也可以一次发送10个数据报, 接收数据报的时候一次可以接收1个也可以接收10个. 即数据在接收和发送的时候的数目是一个位置数, 完全由操作系统决定. 但是TCP实行”顺序控制”, “重发控制”机制同时也涉及”流量控制”, “拥塞控制”

(2)UDP

UDP 是不具有可靠性传输的数据报协议. 它会将细微的处理交给上层的应用层完成. 在 UDP 的情况下, 虽然可以保证发送消息的大小, 但是不能保证消息一定会到达. 如果出错会进行重发处理.

4. TCP 与 UDP 的区分

TCP 用于传输层有必要实现可靠性传输的情况下. 但是 UDP 虽然不可靠但是可以用于那些高速传播的情况下. 比如当我们在看视频的过程中如果出现数据报的丢失, 那么也将会一小部分的数据报, 如果进行重传, 那么客户在观看视屏的过程中无非就会出现等待时间过长的情况, 此时就需要用 UDP 进行传输.

5. TCP 的特点及其目的

为了实现数据的可靠性传输, 因此在进行数据的传输过程中就必须考虑数据的丢包, 破坏, 重复以及数据的分片顺序等等, 因此 TCP 通过检验和, 序列号, 确认应答, 重发机制, 连接管理以及窗口控制等实现可靠性传输

(1) 通过序号确认序号实现可靠性传输

在进行数据的收发过程中, 发送方会将数据发送给接收方, 当接收方接收到数据后会给发送方发送一个确认应答信号代表自己已经接收到数据, 反之, 当发送方发送数据后, 经过一段时间后还没有接受到对方的确认应答信号, 此时发送方会认为接受方没有接收到数据, 因此会将数据进行重发直到收到接受方的确认应答信号. 但是有的时候会出现这种情况, 接受方接受到了发送方给自己发送来的数据, 因此接收方给发送方发送了一个确认信号, 但是此时由于信号在传输的过程中丢了, 此时发送方也得不到接收方的确认应答信号, 因此发送方会不断将数据进行发送, 此时接收方就会收到大量的无用的重复数据报, 此时为了给上层提供可靠的数据, 此时接收方就需要扔掉大量的重复数据报, 为了接收方能够确认自己是否收到重复数据报, 以及自己是否需要接受发送方发送来的数据报, 此时就引入了序列号. 接收方可以通过序列号判断出自己是否收到了重复数据报, 同时当数据报过大的时候发送方会将数据报进行分组, 为了接收方能够正确地将这些分组进行正确组装, 接收方可以通过序列号来正确对数据报进行组装.

(2)重发超时

重发超时指的是在重发数据之前发送方等待接收方确认应答信号到来的特定时间间隔. 当发送方在等待这段时间之后还没有接收到接受方的确认应答信号的时候, 此时就需要重新进行数据报的发送.

(3)TCP 以段为单位发送数据

在进行建立连接的同时就已经确定了数据报的单位, 在进行发送的时候, 为了防止在发送的时候对其进行分片和组装, TCP 在发送的过程中最理想的情况就是发送数据报的时候发送数据报的长度正好我是 IP 数据报不会被分组的最大长度, 这个长度就叫做最大消息长度. 在进行三次握手的时候, 两个主机会将自己可以处理的最大消息长度写入到 MSS 选项, 高速对方自己能够容纳的最大消息长度.

(4) 利用窗口控制提高速度

在之前的数据收发过程中发送方发送一个数据报必须等到收到接受方的确认信号后才能进行发送第二个数据报, 这样显然就降低了双方之间的通信效率, 此时为了提高双方之间的数据传输效率, 此时就给双方定义一个缓冲区, 在接受方缓冲取未满的情况下, 发送方可以无须等到接受方的确认应答信号才发送数据, 发送方可以一次发送一大批的数据. 此时就会引入窗口这个名词, 即窗口的大小无非就是发送方无须等待确认应答一次所能继续发送数据的最的值.

(5)滑动窗口

这里写图片描述
正如上图所示, 透明地方就是滑动窗口, 在窗口左边代表的是已经收到接受方应答的信号, 窗口内部代表的是对方接受缓冲区的大小, 也是已经发送的数据报但是没有接受到应答的数据报, 窗口右边代表的则是还没有发送的数据报.

(6)窗口控制和重发控制

1)确认信号丢失

在为使用窗口机制的时候, 此时必须等到确认信号到达之后才能进行再次的发送数据. 担当引入窗口机制的时候, 此时发送方没有收到接收方的确认应答的时候, 此时由于引入了窗口机制,
发送方可以继续进行发送, 这是就不需要进行重发.
在收到 ACK 信号的时候窗口会自动向右滑动, 操作系统为了实现这个窗口, 在底层是以缓冲区的形式来维护这个窗口, 只有确认应答过的数据才能从窗口中, 即缓冲区中删除.

2)数据报丢失

当在数据进行发送的过程中发送的数据报出现丢失时, 此时接收方会给发送端发送重复的确认信号, 这个确认信号仿佛就是在提醒发送方我要收的数据是 XXX 信号, 此时发送方一旦接受到超过连续的相同的确认应答信号时, 此时它就会认为自己发送的数据丢失, 此时就会引发重传机制.

(7)流量控制

TCP 引入让发送端根据接收端接受能力的大小确认一次发送的最大数据报的数据量, 这就是流量控制.具体表现在当双方在建立连接的时候接收方会告诉发送方自己一次可以接收数据的最大量, 这个量的大小就是对方的接受缓冲区的大小, 也就是对方窗口的大小.于是发送方在发送的时候都会发送一个不超过接受方窗口大小的主句量给对方, 使得对方可以接收.当接受方接受到这个数据时, 此时的窗口会立即设置为一个更小的窗口告诉发送方目前自己可以接收的最大数据量.于是双方就形成了 TCP 的流量控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVa10375

题目描述很简单,就是求两个组合数的商.可是数字范围很大,肯定不能直接计算. 因此要用到唯一分解定理,即将结果全部表示为素因子的幂的形式. #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #inc…

I/O复用的 select poll和epoll的简单实现

http://www.cnblogs.com/wj9012/p/3876734.html 一个tcp的客户端服务器程序 服务器端不变&#xff0c;客户端通过I/O复用轮询键盘输入与socket输入&#xff08;接收客户端的信息&#xff09; 服务器端&#xff1a; 1 /*服务器:2 1.客户端关闭后&#xff0c;服务器再向客户端发送…

netstat 相关命令解析

1.列出所有的端口 netstat -a 列出TCP协议的端口 netstat -at UDP协议的端口 netstat -au 2.列出处于监听状态的socket netstat -l 列出监听的TCP端口 netstat -lt 列出监听的UDP端口 netstat -lu 列出监听的UNIX端口 netstat -lx 3.列出协议的统计信息 nestat …

UVa10791

我们可以先用唯一分解定理将这个数字分解成素因子幂的乘积&#xff0c;为了得到最小的和&#xff0c;我们可以发现&#xff1a;每个 素因子的幂单独分开的和是最小的。 先说明每个素因子都是以出现的最大的次数出现。因为最小公倍数一定&#xff0c;因此至少有一个数字的这个素…

TCP相关代码

TCP 基础代码 //tcp_server.c #include<stdio.h> #include<error.h> #include<sys/types.h> #include<string.h> #include<unistd.h> #include<sys/socket.h> #include<netinet/in.h> #include <arpa/inet.h> #include<st…

UVa1635

我们很容易发现最后每一项的系数就是二项式展开&#xff0c;余数和m没有关系就意味着可以被m整除&#xff0c;因此我们就需要求出每一个二项式的系数。但是数据实在太大我们根据唯一分解定理将m和系数都进行分解&#xff0c;然后比较因子的幂。 二项式的计算我们可以根据杨辉三…

几种并发服务器模型的实现:多线程,多进程,select,poll,epoll

http://www.cnblogs.com/wj9012/p/3879605.html 客户端使用select模型&#xff1a; 1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #include <errno.h>5 #include <sys/types.h>6 #include <sys/socket.h>7 #include …

哈希表1

1. 初始化 void HashInit(HashTable* ht, HashFunc func) {if(ht NULL || func NULL){return;}ht -> size 0;ht -> func func;int i 0;for(; i < HashMaxSize; i){ht -> data[i].state Empty;} } 2. 哈希表的销毁 void HashDestroy(HashTable* ht) {if(ht…

UVa10820

实质上就是求欧拉函数值 书上有个板子挺好&#xff0c;也不难理解。 #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set>using namespace std;typedef l…

linux socket 编程(C语言)

https://www.cnblogs.com/x_wukong/p/4541010.html 最近看了一些网络编程的书籍&#xff0c;一直以来总感觉网络编程神秘莫测&#xff0c;其实网络编程入门还是很容易学的&#xff0c;下面这些代码是我在linux下编写的&#xff0c;已经运行过了&#xff0c;编译之后就可以运行了…

哈希表2

哈希表的初始化 void HashInit(HashTable* ht, HashFunc func) {if(ht NULL){return;}ht -> size 0;ht -> func func;size_t i 0;for(; i < MaxSize; i){ht -> data[i] NULL;} } 哈希表的结点创建 HashElem* CreateHashElemNode(KeyType key, ValueType va…

位图

相关数据结构 typedef uint64_t BitmapType;#define BITMAPMAXSIZE 1000 //位图所能容纳的位数typedef struct Bitmap {uint64_t* data;uint64_t capacity; }Bitmap; 初始化 void BitmapInit(Bitmap* bm, uint64_t capacity) {if(bm NULL){return;}//当capacity 100, 2个元…

C++中的inline用法

https://www.cnblogs.com/fnlingnzb-learner/p/6423917.html 1. 引入inline关键字的原因 在c/c中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了inline修饰符&#xff0c;表示为内联函数。 栈空间就是指…

UVa1262

算是一个模拟吧 #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set> #include<vector>using namespace std;typedef long long ll; const int INF…

一个Linux下C线程池的实现

http://blog.csdn.net/zouxinfox/article/details/3560891 什么时候需要创建线程池呢&#xff1f;简单的说&#xff0c;如果一个应用需要频繁的创建和销毁线程&#xff0c;而任务执行的时间又非常短&#xff0c;这样线程创建和销毁的带来的开销就不容忽视&#xff0c;这时也是线…

Gym100917 A - Abstract Picture

模拟赛的时候看这道题没有什么头绪&#xff0c;当时有点晕&#xff0c;感冒还没有好&#xff0c;回来以后瞟了一眼题解就明白了&#xff0c;自己实现了一下&#xff0c;也没有很复杂。大概的思路就像拓扑排序一样&#xff0c;需要理解因为涂的是有顺序的&#xff0c;所以我们总…

linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)

http://blog.csdn.net/zzyoucan/article/details/9235685 信号&#xff1a;信号是unix中最古老的进程通信的一种方式&#xff0c;他是软件层次上对中断机制的模拟&#xff0c;是一种异步通信方式&#xff0c;信号可以实现用户空间进程和内核空间进程的交互&#xff0c;内核进程…

数据库以及表的基本操作

一.数据库的操作 create database[if not exists]数据库名; 创建一个名字为company2的使用utf8忽略大小写的数据库 create database company charsetutf8 collate utf8_general_ci; 创建一个数据库区分大小写 create database company1 charsetutf8 collate utf8_general_bin;…

linux 网络编程:使用两线程实现socket同时收发数据

http://blog.csdn.net/li_wen01/article/details/52665505 工作中最近有使用到socket 向客户端同时发送和接收数据&#xff0c;因为是嵌入式linux设备&#xff0c;且要求只能同时一个客户端连接该端口。考虑到节省系统资源&#xff0c;只创建了两个线程分别实现服务端的收发数据…

CF Gym102059 H. Fractions

题目要求找到给定区间的化简后分子分母的和小于1000的数字的个数 我的想法是先找到所有的满足要求的最简分数(总数不超过1e6,而且远小于),然后对询问查找每个最简分数出现的次数. #include<cstdio> #include<cstring> #include<algorithm> #include<cli…