TCP中几个用于提高传输效率的机制

1. Nagle算法与ACK延迟确认:

Nagle算法在发送端 开启,限制发送条件;
ACK延迟确认在 接收端 开启,二者的作用都是限制链路中小包的数量。

==> Nagle算法的规则:
(1)如果包长达到MSS,则允许发送;反之如果包长小于MSS,则不允许发送;
(2)如果该包含有FIN,则允许发送;
(3)在TCP连接上最多只能有一个 未被确认的 小数据包,在该分组的确认ACK到达之前,不能发送其他小的数据包;
(4)关闭Nagle算法:套接字开启 TCP_NODELAY 选项。

==> ACK延迟确认:
ACK延迟确认使接收端在收到数据报文后不会立即回复ACK,而是等待发现的数据报文,搭车发送。
ACK延迟确认的时长默认是 200 ms,如果超过 200 ms 都没有反向的业务数据要发送,则单独构造一个ACK确认报文返回发送端。
关闭ACK延迟确认:套接器开启 TCP_QUICKACK 选项。

==> Nagle算法和ACK延迟确认搭配使用,效果可能会不尽如人意:
当服务器有连续多个小包数据发送给客户端,在发送第一个小包之后,客户端收到,因为开启了ACK延迟确认,客户端不会立即回复ACK,需要等待 200 ms 超时,这时服务器因为开启了Nagle算法,同一时间只允许有一个未确认的小包在传,也不会发送下一个小包。
这会导致在等待的 200 ms 这段时间内,网络是处于空闲状态的,降低了传输效率。
当实际业务有这种场景时,允许关闭Nagle算法。

==> TCP_NODELAY 与 TCP_QUICKACK 的设置方法:

#include <sys/types.h>
#include <sys/socket.h>

int i = 1;
int setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &i, sizeof(i));	//关闭Nagle算法
int setsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, &i, sizeof(i));	//关闭QuickAck算法

2. 什么是“窗口关闭”?如何处理?

当接收端的缓冲区大小变为0时,就会发送 WindowSize=0 的窗口通告(通过ACK发送)来阻止发送端再发送数据,直到接收窗口不为0,接收端会发送新的窗口通告,通知发送端继续发送数据。(当接收缓冲区恢复大小不为0时,会 主动 通知发送端继续发送数据

这会引入一个潜在的风险:如果接收端用于通知发送端恢复数据传输的窗口通告ACK丢失,那么双方将陷入死锁。

解决方式是发送端周期性的发送 “窗口探测” 报文(Window Probe),让接收端回复当前的接收窗口大小。

窗口探测的次数一般为 3次,每次大约间隔 30~60 秒。如果3次后接收窗口仍为0,某些TCP实现将会发送RST来中断TCP连接。


3. 什么是“糊涂窗口综合症”?如何避免?

简言之,“糊涂窗口综合症”就是传输小字节的包(小于MSS),导致网络带宽资源的浪费。

当接收缓冲区过小时,通告窗口的大小(awnd)也会很小,此时如果发送数据,会导致TCP开销过大(TCP头长占 20~60 字节,而真正的TCP数据可能只有几个字节)。

为避免浪费带宽资源,应避免发送小包数据,具体做法有两种:
(1)接收端:当接收窗口小于 “min(MSS, 缓存空间/2)” 二者中的较小值时,就发送窗口通告 WindowSize=0,阻止发送端继续发送数据;
(2)发送端:Nagle算法,满足条件才发送。


4. 设置“MSS”的作用是什么?

MSS = Maximum Segment Size,是去除 IP头和TCP头之后的报文最大长度限制。

如果一个TCP包的长度过大,会被分成多个IP分片,由于IP层没有重传功能,全依靠TCP层的重传,当某个IP分片丢失时,会导致整个TCP包(多个IP分片)都需要重传,效率低。

使用MSS对TCP包长进行限制(小于IP包长)的目的在于当发生IP层丢包时只需要重传一个TCP层的分片,而不用重传所有分片。


5. 为什么在有TCP保证可靠传输的情况下,还需要UDP协议?

(1)管理连接的开销:
TCP保证可靠传输的前提条件是建立一对一的连接,每一个TCP连接的正常建立和关闭都需要至少7个报文段(三次握手、四次挥手)的基本开销。
因此 当需要交换少量数据时,一些应用程序更愿意选择在发送和接收数据之前不需要建立连接的UDP协议(此时需要应用程序自己来处理数据校验、重传、流量控制和拥塞管理等);

(2)首部开销:
UDP的头长只有8个字节,TCP的头长在没有OPTION选项字段时是20字节,最长为60个字节;

(3)服务对象:
TCP是一对一的连接,UDP既可以是一对一的传输,也可以是一对多、多对多的传输,支持广播;

(4)传输速率:
TCP因为有流量控制、拥塞控制等算法,会优先保证传输的可靠性,不会最大限度的占满带宽资源。某些下载软件(例如迅雷)会使用UDP传输,这就是为什么当局域网中的某个用户使用下载软件时其他用户几乎无法正常上网的原因。


6. Linux内核通过TCB来管理TCP连接:

fd <—> tcb

TCB = Tcp Control Block,TCP控制块。 它的存在一直伴随着TCP连接的生命周期,只要连接存在,TCB就一直存在。

TCP的11种连接状态(相当于是状态机)、TCP五元组信息(源IP、目的IP、源端口、目的端口、协议类型)、TCP连接对应的发送和接收缓冲区状态 等信息,全部都存储在TCB中。

每个TCB对应一个套接字描述字fd,内核负责维护TCB,将fd提供给应用程序调用,当应用程序调用各种socket编程API时(如accept、connect、send、read等),就可以通过fd找到对应的TCB,进而对TCP连接进行操作。


7. TCP保活机制:

当TCP连接长时间无活动时,TCP会启动保活机制,用于探测对端的连接是否还在,如果对端的实例已经被释放(例如应用程序宕掉,端口无人监听,内核协议栈会回复RST) 或 报文没有得到响应(例如对端主机不可达),本端TCP在连续几次探测无果后会将连接关闭。

net.ipv4.tcp_keepalive_time = 7200		//表示保活时间为7200秒(2小时),超过这个时间的连接没有任何活动,则会启动保活机制
net.ipv4.tcp_keepalive_intvl = 75		//表示每次探测间隔75秒
net.ipv4.tcp_keepalive_probes = 9		//表示如果检测9次无响应,则判定对方不可达,中断连接

tcp_keepalive_time + (tcp_keepalive_intvl * tcp_keepalive_probes) = 7200 + 75 * 9 = 7875秒

也就说,在Linux系统中,需要经过 2小时11分15秒 才会发现一个无活动连接。


8. shutdown 与 close 的区别:

#include <sys/socket.h>
int shutdown(int sockfd, int how);	//SHUT_RD, SHUT_WR, SHUT_RDWR

#include <unistd.h>
int close(int fd);

(1)最明显的区别:close是全关闭,关闭一个连接的两个传输方向,应用程序调用close后,将套接字从内存中清除,不会再从这个fd对应的TCP连接上读取或发送数据;
shutdown是半关闭,可以指定关闭连接的读或写中的某一个方向,关闭后fd依然存在,仍然可以被应用程序的socket API函数继续调用。

(2)close是对套接字描述符fd的引用计数减1,并不是真正的关闭TCP连接,需要等到fd的引用计数降为0才会真正关闭(例如父子进程使用同一套接字fd的情况);shutdown会立即发送一个FIN到对端。

注:shutdown中 SHUT_RD 不会发出FIN,SHUT_WR和SHUT_RDWR会发出FIN。
SHUT_RD 只是用户进程通知内核我不再从这条连接上读取数据了,对端可以通过TCP发送数据过来,但是数据到达内核的TCP接收缓冲区后,不会通知已调用SHUT_RD的应用进程;
SHUT_WR 表示用户进程通知内核我不会再向这条连接上写入数据,此时内核会发送FIN通知对端,本连接将不会写入数据,关闭写方向。)


9. 使用 tcpdump 抓取TCP报文进行分析的方法:

tcpdump -i eth1 -n and tcp and src port 65535 and src host 127.0.0.1
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重庆交通大学信息科学与工程学院 课程设计实验报告 专 业: 学 号: 姓 名: 实验室(心): 信息技术软件实验室 指 导 教 师 : 实验完成时间: 2015 年 1 月 12 日 目录 实验设计题目---------------------------------------------------------------- -----2 实验目的-------------------------------------------------------------------- -------2 实验设计要求---------------------------------------------------------------- -----2 课程设计条件---------------------------------------------------------------- -----2 五、实验设计分析------------------------------------------------------------ ---------4 六、实验设计流程图---------------------------------------------------------- --------9 七、结果分析---------------------------------------------------------------- -----------13 八、实验心得体会------------------------------------------------------------ ---------14 九、实验主要代码------------------------------------------------------------ ---------15 实验设计题目 基于TCP的服务器/客户端程序设计 实验目的 理解客户端与服务器模型的工作原理。 掌握套接字的概念。 掌握TCP协议,基于TCP协议来设计此客户端/服务器程序。 通过设计面向连接的数据流传输服务程序,加深对面向连接的服务程序工作流程和基本 框架的理解。 实验设计要求 1)任选一种编程语言,编程实现面向连接的客户/服务器程序,客户端、服务器端分 别编程; 2) 编程要充分体现服务器端与客户端的连接建立、数据传输、连接释放的过程; 四、课程设计条件 本次课程设计我采用的是JAVA语言,实现客户端和服务器之间的联系。 Java 编程语言的风格十分接近C、C++语言。Java是一个纯的面向对象的程序设计语言,它继 承了 C++语言面向对象技术的核心。Java舍弃了C ++语言容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再 被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进 制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实 现了"一次编译、到处执行"的跨平台特性。不过,每次的执行编译后的字节码需要消耗 一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 Java语言的变量声明,操作符形式,参数传递,流程控制等方面和C语言,C++语言完 全相同.尽管如此,Java和C语言,C++语言又有许多差别,主要表现在如下几个方面: Java对内存的分配是动态的,它采用面向对象的机制,采用运算符new为每个对象 分配内存空间,而且,实际内存还会随程序运行情况而改变。程序运行 Java系统自动对内存进行扫描,对长期不用的空间作为"垃圾"进行收集,使得系统资源 得到更充分地利用.按照这种机制,程序员不必关注内存管理问题,这使Java程序的编写 变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。而C语言通过m alloc()和free()这两个库函数来分别实现分配内存和释放内存空间的,C++语言 则通过运算符new和delete来分配和释放内存。在C和C++这种机制,程序员必须非常仔 细地处理内存的使用问题。一方面,如果对己释放的内存再作释放或者对未曾分配的内 存作释放,都会造成死机;而另一方面,如果对长期不用的或不再使用的内存不释放, 则会浪费系统资源,甚至因此造成资源枯竭。 Java不在所有类之外定义全局变量
网络安全知识入门全文共18页,当前为第1页。网络安全知识入门 网络安全知识入门全文共18页,当前为第1页。 网络安全知识入门 近日,因为工作需要,对于网络安全的一些基础的知识做了一些简单的了解,并整理成总结文档以便于学习和分享。 网络安全的知识体系非常庞大,想要系统的完成学习非简单的几天就可以完成的。所以这篇文章是以实际需求为出发点,把需要用到的知识做系统的串联起来,形成知识体系,便于理解和记忆,使初学者可以更快的入门。 1、什么是网络安全 网络安全知识入门全文共18页,当前为第2页。首先我们要对网络安全有一个基本的概念。网络安全是指网络系统的硬件、软件及其系统的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不断。简单来说就是,保护网络不会因为恶意攻击而断。了解了网络安全的职责,我们就可以从网络攻击的方式,网络攻击检测手段等几个方面来处理。在实际的学习,我发现直接上手去学习效率并不是很好,因为网络安全也有很多的专业名词是不了解的所以在系统的学习之前对本文可能涉及到的专业名词做一个解释很有必要。 网络安全知识入门全文共18页,当前为第2页。 2、网络安全名词解释 IRC服务器:RC是Internet Relay Chat 的英文缩写,文一般称为互联网继聊天。IRC的工作原理非常简单,您只要在自己的PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。它的特点是速度非常之快,聊天时几乎没有延迟的现象,并且只占用很小的带宽资源。 TCP协议:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP的安全是基于三次握手四次挥手的链接释放协议(握手机制略)。 网络安全知识入门全文共18页,当前为第3页。UDP协议:UDP 是User Datagram Protocol的简称,UDP协议全称是用户数据报协议,在网络它与TCP协议一样用于处理数据包,是一种无连接的协议。其特点是无须连接,快速,不安全,常用于文件传输。 网络安全知识入门全文共18页,当前为第3页。 报文:报文(message)是网络交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。 DNS:DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。DNS协议运行在UDP协议之上,使用端口号53。DNS是网络攻击的一个攻击密集区,需要重点留意。 ICMP协议:ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。 网络安全知识入门全文共18页,当前为第4页。SNMP协议:简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支网络安全知识入门全文共18页,当前为第5页。持网络管理系统,用以 网络安全知识入门全文共18页,当前为第4页。 网络安全知识入门全文共18页,当前为第5页。 网络安全知识入门全文共18页,当前为第6页。 网络安全知识入门全文共18页,当前为第6页。 传播,传染途径是通过网络和电子邮件。。对于蠕虫,现在还没有一个成套的理论体系。一般认为:蠕虫是一种通过网络传播的恶性病毒,它具有病毒的一些共性,如传播性、隐蔽性、破坏性等等,同时具有自己的一些特征,如不利用文件寄生(有的只存在于内存),对网络造成拒绝服务,以及和黑客技术相结合,等等。 3、常见网络攻击方式 网络攻击的方式多种多样,本文就以其六种常见的攻击方式来做分析和了解。 3.1半连接攻击 网络安全知识入门全文共18页,当前为第7页。众所周知TCP的可靠性是建立在其三次握手机制上面的,三次握手机制如果没有正常完成是不会正常连接的。半连接攻击就是发生在三次握手的过程之。如果A向B发起TCP请求,B也按照正常情况进行响应了,但是A不进行第3次握手,这就是半连接攻击。实际上半连接攻击时针对的SYN,因此半连接攻击也叫做SYN攻击。SYN洪水攻击就是基于半连接的SYN攻击。 网络安全知识入门全文共18页,当前为第7页。 3.2全连接攻击 全连接攻击是一种通过长时间占用目标机器的连接资源,从而耗尽被攻击主机的处理进程和连接数量的一种攻击方式。 客户端仅仅"连接"到服务器,
网络安全知识入门 下面是对于网络安全的一些了解。 网络安全的知识体系非常庞大,想要系统的完成学习非简单的几天就可以完成的。所以 这篇文章是以实际需求为出发点,把需要用到的知识做系统的串联起来,形成知识体系 ,便于理解和记忆,使初学者可以更快的入门。 1、什么是网络安全 首先我们要对网络安全有一个基本的概念。网络安全是指网络系统的硬件、软件及其系 统的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连 续可靠正常地运行,网络服务不断。简单来说就是,保护网络不会因为恶意攻击而 断。了解了网络安全的职责,我们就可以从网络攻击的方式,网络攻击检测手段等几个 方面来处理。在实际的学习,我发现直接上手去学习效率并不是很好,因为网络安全 也有很多的专业名词是不了解的所以在系统的学习之前对本文可能涉及到的专业名词做 一个解释很有必要。 2、网络安全名词解释 1. IRC服务器:RC是Internet Relay Chat 的英文缩写,文一般称为互联网继聊天。IRC的工作原理非常简单,您只要在自己的 PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。它的特 点是速度非常之快,聊天时几乎没有延迟的现象,并且只占用很小的带宽资源。 2. TCP协议:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP的安全 是基于三次握手四次挥手的链接释放协议(握手机制略)。 3. UDP协议:UDP 是User Datagram Protocol的简称,UDP协议全称是用户数据报协议,在网络它与TCP协议一样用于处理 数据包,是一种无连接的协议。其特点是无须连接,快速,不安全,常用于文件传输。 4. 报文:报文(message)是网络交换与传输的数据单元,即站点一次性要发送的数据块。 报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。 5. DNS:DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够 使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。DNS协议运行 在UDP协议之上,使用端口号53。DNS是网络攻击的一个攻击密集区,需要重点留意。 6. ICMP协议:ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、 路由器之间传递控制消息。 7. SNMP协议:简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层 协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设 备是否有任何引起管理上关注的情况。 8. 僵尸病毒:僵尸网络病毒,通过连接IRC服务器进行通信从而控制被攻陷的计算机。僵尸 网络(英文名称叫BotNet),是互联网上受到黑客集控制的一群计算机,往往被黑客用 来发起大规模的网络攻击。僵尸病毒的目的在我看来是黑客在实施大规模网络攻击之前 做好准备工作,提供大量可供发起攻击的"僵尸电脑"。 9. 木马病毒:木马(Trojan),也称木马病毒,是指通过特定的程序(木马程序)来控制另 一台计算机。"木马"程序是目前比较流行的病毒文件,与一般的病毒不同,它不会自我 繁殖,也并不"刻意"地去感染其他文件,它通过将自身伪装吸引用户下载执行,向施种 木马者提供打开被种主机的门户,使施种者可以任意毁坏、窃取被种者的文件,甚至远 程操控被种主机。木马病毒对现行网络有很大的威胁。 10. 蠕虫病毒:蠕虫病毒,一种常见的计算机病毒。它的传染机理是利用网络进行复制和传 播,传染途径是通过网络和电子邮件。。对于蠕虫,现在还没有一个成套的理论体系。 一般认为:蠕虫是一种通过网络传播的恶性病毒,它具有病毒的一些共性,如传播性、 隐蔽性、破坏性等等,同时具有自己的一些特征,如不利用文件寄生(有的只存在于内 存),对网络造成拒绝服务,以及和黑客技术相结合,等等。 3、常见网络攻击方式 网络攻击的方式多种多样,本文就以其六种常见的攻击方式来做分析和了解。 3.1半连接攻击 众所周知TCP的可靠性是建立在其三次握手机制上面的,三次握手机制如果没有正常完成 是不会正常连接的。半连接攻击就是发生在三次握手的过程之。如果A向B发起TCP请求 ,B也按照正常情况进行响应了,但是A不进行第3次握手,这就是半连接攻击。实际上半 连接攻击时针对的SYN,因此半连接攻击也叫做SYN攻击。SYN洪

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值