c++ udp多线程 例子_计算机网络知识梳理(4)——TCP/UDP、TCP三次握手与四次挥手...

TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

e3c3c44439371affc20f5f9c1b18c38a.png

注:seq:"sequance"序列号;ack:"acknowledge"确认号;SYN:"synchronize"请求同步标志;;ACK:"acknowledge"确认标志";FIN:"Finally"结束标志。

f195636bf5d8f39193c716e58906d318.png

第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

90bc28de185bc9023f35ea4cab3440e2.png


第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。

f777bf1a8d8cd10c5799b784c34008df.png

第三次握手.
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1

6a034e0d61f6a87a011f0654cc0fbb22.png

SYN攻击
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV
一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.
但是不能完全防范syn攻击。

2a09eb423bdeb5756b0dbfe86a436b9f.png

wireshark抓包

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这个问题可以参考《unix 网络编程》(第三版,2.7 TIME_WAIT状态)。

TIME_WAIT状态由两个存在的理由。

(1)可靠的实现TCP全双工链接的终止。

这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

(2)允许老的重复的分节在网络中消逝。

假 设在12.106.32.254的1500端口和206.168.1.112.219的21端口之间有一个TCP连接。我们关闭这个链接,过一段时间后在 相同的IP地址和端口建立另一个连接。后一个链接成为前一个的化身。因为它们的IP地址和端口号都相同。TCP必须防止来自某一个连接的老的重复分组在连 接已经终止后再现,从而被误解成属于同一链接的某一个某一个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的链接发起新的化身。既然 TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活msl秒即被丢弃,另一个方向上的应答最多存活msl秒也被丢弃。 通过实施这个规则,我们就能保证每成功建立一个TCP连接时。来自该链接先前化身的重复分组都已经在网络中消逝了。

3. 为什么不能用两次握手进行连接?

我们知道,3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

常见面试题:

  • TCP协议和UDP协议的区别是什么
    • TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的
    • TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
    • TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
    • TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率
    • TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信。
    • TCP面向的是字节流的服务,UDP面向的是报文的服务。
    • TCP介绍和UDP介绍
  • 请详细介绍一下TCP协议建立连接和终止连接的过程?
  • 三次握手建立连接时,发送方再次发送确认的必要性?
      • 主 要是为了防止已失效的连接请求报文段突然又传到了B,因而产生错误。假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结 点长时间滞留了,一直延迟到连接释放以后的某个时间才到达B,本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次 新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了,这样一直等待A发来数据,B的许多 资源就这样白白浪费了。
  • 四次挥手释放连接时,等待2MSL的意义?
      • 第 一,为了保证A发送的最有一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK 报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。
      • 第二,就是防止上面提到的已失效的连接请求报文段出现在本连接中,A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

常见的应用中有哪些是应用TCP协议的,哪些又是应用UDP协议的,为什么它们被如此设计?

  • 以下应用一般或必须用udp实现?多播的信息一定要用udp实现,因为tcp只支持一对一通信。如果一个应用场景中大多是简短的信息,适合用udp实现,因为udp是基于报文段的,它直接对上层应用的数据封装成报文段,然后丢在网络中,如果信息量太大,会在链路层中被分片,影响传输效率。如果一个应用场景重性能甚于重完整性和安全性,那么适合于udp,比如多媒体应用,缺一两帧不影响用户体验,但是需要流媒体到达的速度快,因此比较适合用udp如果要求快速响应,那么udp听起来比较合适如果又要利用udp的快速响应优点,又想可靠传输,那么只能考上层应用自己制定规则了。常见的使用udp的例子:ICQ,QQ的聊天模块。

以qq为例的一个说明(转载自知乎)

登陆采用TCP协议和HTTP协议,你和好友之间发送消息,主要采用UDP协议,内网传文件采用了P2P技术。总来的说:
1.登陆过程,客户端client 采用TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有一个TCP连接来保持在线状态。
2.和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
3.如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。

26a5c71b7ffd0cadebea4e7a4a40815d.png

使用TCP的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。

补充UDP:

UDP用户数据报协议,是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。

  UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。

  每个UDP报文分UDP报头和UDP数据区两部分。报头由四个16位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度以及校验值。UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:
  (1)源端口号;

  (2)目标端口号;

  (3)数据报长度;

  (4)校验值。

  使用UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。

  TCP 与 UDP 的区别:TCP是面向连接的,可靠的字节流服务;UDP是面向无连接的,不可靠的数据报服务。

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

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

相关文章

appender log4j 扩展_Log4j扩展使用--输出地Appender

OK,现在我们来研究输出低Appended。Appender控制日志输出的位置Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。Log4j内置了常用的输出地,一般…

2017c语言考核册答案,2017年电大《C语言程序设计》形成性考核册答案.doc

C语言程序设计形成性作业一1.?????? 在每个C语言程序中都必须包含有这样一个函数,该函数的函数名为( A )。A.main B.MAIN C.name D.funtion2.C语言原程序文件的缺省扩展名为( D )。A.cpp …

python max取下标_Python 变量类型总结

变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或…

mybatis支持驼峰自动转换sql吗_SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换...

一、简述mybatis驼峰式命名规则自动转换:使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”;使用好处:省去mapper.xml文件中繁琐编写表字段列表与表实体类属性的映射关系,即resultMap。示例…

c语言存储大范围整形,C语言整形数值范围问题

有符号二进制数的表示是这样的&#xff1a;如果计算机的字长为n位&#xff0c;n位二进制数的最高位为符号位。其余n-1位为数值位&#xff0c;采用补码表示法时&#xff0c;可表示的数X的范围是 -2的(n-1)次幂 < X < 2的(n-1)次幂-1。如果字长是16位&#xff0c;补码表示的…

vue修改计算属性的值_Vue语法高级之计算属性和侦听器

计算属性和侦听器都可以监听到data区数据的变化&#xff0c;当数据变化时可以触发方法的调用&#xff0c;从而在方法内部可以进行相应的逻辑处理。计算属性的语法格式是&#xff1a;computed: {}侦听器的语法格式是&#xff1a;watch: {}一、计算属性计算属性一般是为了简化模板…

三次hermite插值多项式例题_2点三次Hermite插值多项式解析.ppt

2点三次Hermite插值多项式解析1.问题的提法 分段三次Hermite插值多项式存在唯一 三.分段三次Hermite插值 2.分段三次Hermite插值的表达式 当 x∈[xi&#xff0c;xi1]时, 两点Hermite插值 ( i 0,1,2,,n-1) 定理&#xff1a; 设 f(x)在[a,b]上具有四阶连续导数&#xff0c;S3(x)是…

sqlserver查看索引_SQL Server页中行物理存储

SQL Server页有很多类型&#xff1a;1 – 数据页. 记录堆或者聚集索引叶子级的数据2 – 索引页. 用于保存聚集索引中的中间页和根页&#xff0c;或者非聚集索引的所有页3 – text mix page. A text page that holds small chunks of LOB values plus internal parts of text tr…

华为畅享max有没有人脸识别_华为手机有人脸识别功能吗?

展开全部华为5X有的1、请插e5a48de588b63231313335323631343130323136353331333365633837入手机卡&#xff0c;开启数据业务。第一次使用“人脸解锁”功能时&#xff0c;需要连接网络之后才可以激活。所以当第一次进入系统设置->安全->屏幕锁定中&#xff0c;可能会不能马…

c 语言 结构体 编程,C语言:结构体的编程问题(很简单)

C语言&#xff1a;结构体的编程问题(很简单)答案:2 信息版本&#xff1a;手机版解决时间 2020-07-25 02:18已解决2020-07-24 02:27先定义一个结构体Student&#xff0c;它包含四个成员&#xff1a;学号(number)、姓名(name)、电话(telphone)、地址(address)&#xff0c;然后定…

gin 怎么通过 post 发送结构体_Go Web 框架 Gin 实践12—优化配置结构及实现图片上传...

Go语言中文网&#xff0c;致力于每日分享编码、开源等知识&#xff0c;欢迎关注我&#xff0c;会有意想不到的收获&#xff01;项目地址&#xff1a;https://github.com/EDDYCJY/go-gin-example如果对你有所帮助&#xff0c;欢迎点个 Star 前言一天&#xff0c;产品经理突然跟你…

python次方运算_neg__python 魔术方法1 运算符重载

python中存在一些特殊的方法&#xff0c;这些方法通常采用格式&#xff1a;__method__()。这些方法会在特定的情况下自动调用。例如&#xff1a;__new__()、__init__()、__del__() 等生命周期方法。正是这些特殊方法&#xff0c;构建了python的语言风格。特殊方法有很多&#x…

resnet50网络结构_AAAI2020 | 利用网络结构关系加速NAS+Layer

这是我在海康威视研究院实习的工作&#xff0c;被AAAI-2020接收为Spotlight。论文地址&#xff1a;http://xxx.itp.ac.cn/pdf/2002.12580v1引子上一个阶段的网络结构搜索(NAS)研究&#xff0c;主要在两个方面。1)各类搜索方法&#xff0c;从强化学习、进化算法等到梯度下降&…

python 去除nan inf_Python实现半自动评分卡建模(附代码)

作者&#xff1a;Summer Memories个人公众号&#xff1a;风控汪的数据分析之路知乎专栏&#xff1a;小鑫的数据分析笔记这次分享一个自己写的python脚本&#xff0c;可以实现半自动化的评分卡建模。运行脚本时需要input已经预处理好的训练集和测试集数据&#xff0c;所以建模前…

国嵌c语言深度,国嵌C语言3部全

课程目录&#xff1a;国嵌 C语言深度剖析班&#xff1a;1课-基本数据类型分析2 auto,register,static分析3 if,switch,do,while,for分析4 goto,void,extern,sizeof分析5 const和volatile分析6 struct和union分析7课-enum和typedef分析8 注释符号9 接续符和转义符10 单引号和双引…

linux如何判断网线插入_“Linux”中如何判断哪个网卡连接网线?

展开全部【解决方法】1、ifconfig查看现在使用的网e68a84e8a2ad3231313335323631343130323136353331333365633935卡。2、ethtool命令查看网卡的具体信息,如eth0是连接状态&#xff0c;则正常使用。2、在ifconfig中可以看到有eth2这个网卡&#xff0c;但不知道是否连线&#xff…

单调有界定理适用于函数吗_《实变函数》——论有界变差函数

一日不见如隔三秋&#xff0c;本人觉得有界变差函数是实变函数中最容易理解且和高等数学联系最紧密的一个概念&#xff0c;其在概率论中也有非常广泛的应用&#xff0c;也和勒贝格空间有着千丝万缕的联系。什么叫有界变差函数&#xff1f;若在区间(a&#xff0c;b)中&#xff0…

msp430 c语言开发环境,如何使用C语言来编写MSP430的高质量代码

微处理器一般用于特定环境和特定用途,出于成本、功耗和体积的考虑&#xff0c;一般都要求尽量节省使用资源&#xff0c;并且&#xff0c;由于微处理器硬件一般都不支持有符号数、浮点数的运算&#xff0c;且运算位有限&#xff0c;因此&#xff0c;分配变量时必须仔细。另外要说…

oracle 增量设为3 循环_Oracle 差异性增量 和 累计增量 原理(转)

RMAN一个强大的功能是支持增量备份&#xff0c;增量备份中心思想就是减少备份的数据量&#xff0c;我们不需要在从头开始备份了&#xff0c;只需要备份自上次已备份之后的数据块即可。Oracle 9i 共有五种级别 0 1 2 3 4&#xff0c;0级最高-4级最低&#xff0c;0级是1级的基础以…

springboot redis 断线重连_Redis(9)——史上最强【集群】入门实践教程

一、Redis 集群概述Redis 主从复制到 目前 为止&#xff0c;我们所学习的 Redis 都是 单机版 的&#xff0c;这也就意味着一旦我们所依赖的 Redis 服务宕机了&#xff0c;我们的主流程也会受到一定的影响&#xff0c;这当然是我们不能够接受的。所以一开始我们的想法是&#xf…