关于tcp和udp的小结

网络的概述

网络的核心是分开的终端的应用程序之间通过信息的交流来完成功能。围绕着这些信息,如何使得这些信息能够准确地传递到某个终端的应用程序中,并且使得该应用程序能够准确读出这些信息的内容。所以有了这些各式各样的协议。
其中tcp是传输控制协议,而udp是用户数据报协议。
当前互联网是以TCP/IP协议族为基础构建的,TCP/IP协议是一系列网络协议的总称,可以划分为四层:
链路层、网络层、传输层和应用层。
链路层主要负责封装和解封装IP报文。
网络层通过各终端连接起来的各类网络的路径,将IP报文发送给目标网络或者主机、
传输层提供了端到端的通信。因为网络层只能帮助将报文发送至一个终端,但是一个终端不止一个程序在联网通信。如何区分各个进程,这需要传输层的作用了。传输层管理了该终端的应用程序,通过报文中的传输层信息它将报文分发给不同的应用程序。感觉传输层类似于房子里的电气线路,这些线路在房间的各个角落吧,提供了各种插口,也叫做socket。

而应用层负责向用户提供应用程序。这如何理解呢? 应用层协议中的协议头这些是负责解释协议头后面的数据报文的。
网络应用之间是通过消息进行相互作用的,核心就是应用协议中的信息。
可以理解为房屋内用插头接上这些插口的电器。

用一个例子总结的话,将A地和B地的两台计算机进行一个通信? 首先得有物理的媒介, 用什么物理媒介? 电话线?光缆?有了媒介后,在媒介之上,用什么格式的消息进行传输?这就是链路层的作用。有了链路了,就好比有了四通八达的交通网。下一步就是在交通网上选择一个正确的路径,将信息传递到目的地。对这些路径的抽象,就叫做图网络。网络层就是负责在图网络中找到路径然后将报文发送至目的地,网络层的核心是IP协议。那有了IP协议还是不够的,因为网络层负责发送到某一点,就是某一个屋子,但是具体要到哪一个程序呢?
这就需要传输层。传输层它管理终端的进程,它将报文发送至具体的应用程序。 而最后的应用程序将报文进一步解包,提取出应用层协议的时候,这时候按照应用层协议的报头规则解析协议得到正确格式的消息。于是应用程序得以运转。

tcp和udp

udp是无连接协议,它属于传输层协议。位于IP上一层。它没有tcp协议丰富的功能,udp发送数据后并不保证其是否能够到达目的地且不会重传。只负责发送报文,不会对数据报文进行拼接这些操作。它还可以进行单播多播广播。总体来说,它不可靠。优势就是效率很高。至于tcp,它负责两个终端的应用程序之间进行可靠的通信。怎么叫可靠呢? 比如 看网页,我希望网页能够内容完整且有序。
tcp是面向连接的,可靠的流协议。 所谓流就是不间断的数据结构。tcp协议可以做到超时重传和流量控制。它采用三次握手建立连接, C端向server发送了建立连接的请求,这是第一次握手,client发送了一个SYN请求报文,该报文段具有自身的数据通讯初始序列号,而server端接收了SYN报文后,向client端发送了SYN+ACK报文,表明client端可以和server端建立连接。client端接收到SYN+ACK报文后向server端发送ACK报文,从而正式和server端建立了连接。

为什么要三次握手呢?

RFC793文档中写到,tcp协议需要seq序列号来做可靠重传或者接收,从而避免连接复用时候无法分别出seq是延迟或者是旧链接的seq。因此需要三次握手。tcp是通过seq(序列号,sequence numbers)来实现可靠连接的。tcp每发送的一个包,都有一个sequence bumber,每个包都有序列号,所以能够定位这些包并确认是否收到。由于确认机制是累计的,所以对于一个 序列号为5的包,就意味着5之前的1-4序列号的包都是已经确认接收到的。
当tcp这条连接突然断开之后,tcp如何识别之前旧链接然后重新建立连接?
所以需要一个独一无二的初始序列号(initial sequence number,ISN)机制.因为网络不存在全局时钟无法知道一个包是否是延迟到达的,
举个列子,接收方server接收道一个SYN时,它并不知道这个SYN延迟了多久,一个包A比包B先到达server,但是B实际上有可能是比A先发送的。
如果有client的ISN,经过序列号的比较就可以按照顺序拼接出完整信息。
因此确定报文顺序的办法是端和端连接的时候采用逻辑时钟。初始序列号ISN就是逻辑时钟的起始。ISN通过SYN报文发送,client端发送SYN报文使server端得知了client的
ISN,所以接下来client发送的报文无论到达server的顺序是怎样的,server都可以通过每个报文的序列号和ISN的比较来理清楚每个报文的先后顺序,把这些报文拼接到一起。
而TCP协议是可靠的,这要求一方发送,另一方必须确认。确认就是ACk报文,用来确认发送的报文的内容。所以接收方一定要向发送方返回一个ACK。如果不确认,那就表明发送方发给接收方的是可靠包,而接收方返回给发送方的是不可靠包。所以client也必然再给server一个ACK。
这样才能够保证双向的可靠性。所以两次握手肯定不行,因为server在发送了ACK+SYN后,client没有回应ACK,这就代表这个从server到client的连接不可靠。仅有一方不可靠是不可以建立TCP连接的。
举例,第一次建立连接的时候, 一端生成了32位的ISN,发送方和接收方都会有自己的ISN,所以client在向server发送的是client的SYN(“我的ISN是XXX”),而server端此时回应应当用的是ACK,意思是"我知道你的SYN是xxx"。同时,server端也生成自己的SYN,
然后将自己的SYN和ACk一并发送给client端。最后client端再发送ACk确认报文,说我也知道了你的ISN是YYY了。
至于为什么不是四次,其实ACK+SYN 这一步就是合并了,提高了效率。三次握手是理论上的最小值。

综上三次握手是必然的,因为整个网络不存在全局时钟,因此只能通过相对的逻辑时钟,来确定顺序。所以有一个初始的序列号非常重要,这个序列号会决定对后面接收到的包如何排序。

http长短连接

建立tcp连接后,即使没有数据传输也要保持连接,就是长连接;
而反之就是短链接。
http是无状态的,意味着每次执行一次http操作就连接一次,但是任务执行完就断开。
流程如下:
浏览器client发起并且建立TCP连接->
client发送Httprequest请求报文->
server接收到httpRequest报文->
server的httphandler处理并发送httpResponse报文给client->
发送完毕后server调用socket.close关闭自己的socket对象->
client接收到报文后也会接到server端断开tcp连接的信号->于是client调用本地socket.close方法关闭。

本质上http协议不存在断开和连接的说法。因为断开和连接是tcp协议负责的。
tcp协议上传输的http协议报文是负责对http报文的内容进行解析的规则。
短连接就是指client和server建立tcp连接后,client发送了http请求,server端向其回应了之后又给client端断开tcp连接的信号。
然后经过四次挥手,两端断开。如果client端还要进行请求,那就重新开始。

但是http1.1增加了长连接功能。但是还是无状态的。
长连接用于操作频繁点对点的通信,而且连接数不能太多。比如数据库的连接。
但是像web网站一般用短链接,因为有大量的客户端向其请求,如果用长连接,那么资源开销是巨大的。

ddos攻击

分布式拒绝服务 攻击。
通过控制大量的客户端向服务器同时发起恶意的大流量请求,对服务器的资源超负荷占用,导致服务器无法运转下去从而宕机。
应对的方法有高防服务器。专用领域的产品。
常用的是黑名单,通过防火墙或者IDS进行设置,对特定的规则进行识别然后屏蔽IP。
还有就是ddos清洗,对发起请求但是一定时间内不做任何操作的IP将其踢出去。其实就是异常流量监控。统计分析流量行为,建立识别模型。

cdn加速。将网站的IP隐藏,同时分散流量。

参考资料

传输层作用 https://blog.csdn.net/hanzhen7541/article/details/79071615
tcp和udp的区别 https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html
为什么是三次握手而不是四次 https://www.zhihu.com/question/24853633
网络连接中的长连接和短链接是什么意思? https://www.zhihu.com/question/22677800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值