‘壹’ Web阶段——TCP/UDP区别
2018-09-25
全称:Transmission Control Protocol(传输控制协议),是工作在OSI七层模型(Open System Interconnect,开放式系统互联)中的传输层,是一种面向连接的、可靠的、基于字节流的通信协议。
TCP层将应用层的数据流分成报文段,再继续向网络层传输。为了数据传输的可靠性,TCP层将每个报文段进行了编号,用来保证接收端数据的我完整性。
TCP层每传输一个报文段,就向接收端发送一次确认信息。在一定时间内,如果接收端没有返回确认信息,发送端将重新发送丢失的报文。
全称:User Datagram Protocol(用户数据报协议),与TCP一样工作在传输层,是一种面向无连接的、不可靠的通信协议。
UDP仅将应用层的数据流分成报文直接进行传输,不进行排序。数据安全没有保障,但操作效率高,适合普通数据传输(QQ)。
连接时:
1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。
2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y、对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。
3. .客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1和序号x+1的ACK报文,一个标准的TCP连接完成。
#TCP断开连接四次挥手过程:
1. Client端发起中断连接请求,也就是发送FIN报文。
2. Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。
3. 这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。
4. Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
本文来自 tensorzhl 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/tensorzhl/article/details/75797364?utm_source=
‘贰’ 【web】TCP和UDP、HTTP的区别
(1) TCP是面向连接的,UDP是无连接的 ,即发送数据前不需要先建立链接。
(2) TCP提供可靠的服务 。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。 并且因为tcp可靠,面向连接,不会丢失数据因此适合大数据量的交换。
(3) TCP是面向字节流,UDP面向报文 ,并且网络出现拥塞不会使得发送速率降低(因此会出现丢包,对实时的应用比如IP电话和视频会议等)。
(4) TCP只能是1对1的,UDP支持1对1、1对多 。
(5) TCP的首部较大 为20字节,而UDP只有8字节。
(6)TCP是面向连接的可靠性传输,而UDP是不可靠的。
(7) TCP和UDP都是传输层的协议,HTTP是在应用层的一个协议
(8)HTTP协议基于请求\响应模型的,并且是 基于TCP协议 的。
HTTP协议是建立在请求/响应模型上的。首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,请求中包含请求方法、URL、协议版本以及相关的MIME样式的消息。服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。
(9)HTTP/1.0为 多次的TCP 链接,HTTP/1.1提出了可持续链接即只建立 一次TCP链接 。
因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性,因此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。
‘叁’ 如何让自己的产品快速实现北斗短报文功能
从技术层面来分析,举一个例子:海聊开发者平台,一个极力于为开发者实现“零门槛”的快速接入使用北斗短报文通信服务的平台。构建了稳定的北斗短报文通信服务站,硬件多卡通道与云服务的配合,数据的安全与云备份,抽离提取的简易的SDK,是基于简单快速、灵活,通信速度快的HTTP协议。HTTP协议作为Web开发的基础一直被大多数人所熟知,一次WEB资源请求的过程,其实就和一次方法调用特别相似。
注册成为了开发北斗开发者,获取相应的授权使用的参数,调用接口:1)发送北斗短报文。 2)接受北斗短报文。是不是简单又快捷,也许仅仅只需要简简单单几分钟,你就能为应用接入了最基础短报文的功能。
‘肆’ 计算机网络——应用层-Web&HTTP
计算机网络系列博文——目录
20世纪90年代初
因特网应用
Web应用的组成
由对象组成。对象是一个文件,如HTML文件,JPEG图像,Java程序,视频片段等。
对象可通过一个URL地址寻址。
Web页面常由一个HTML基本文件和多个引用对象构成。
URL(Uniform Resoure Locator):统一资源定位器 RFC1738
用以寻址Web对象
由一个存放对象的服务器主机名和对象路径名构成。
HTTP 由客户端程序和服务端程序实现,二者通过交换HTTP报文会话。
HTTP规范定义了HTTP客户端和服务端之间的通信协议。
Web浏览器实现HTTP客户端,请求、接收、展示Web对象
Web服务器实现HTTP服务端,响应客户的请求,发送对象
HTTP使用TCP作为支撑运输层协议。
端口:80
无状态协议 服务器不保存关于客户的任何信息
服务器向客户发送被请求的文件,而不存储任何关于客户的状态信息。
往返时间(Round-Trip Time,RTT)
一个短分组从客户到服务器然后再返回客户所花费的时间。
某客户和服务器的一次会话中,每个请求/响应对通过一个单独的TCP连接传输
HTTP 1.0版本使用非持续性连接
对多个待获得的web对象,客户端一次只请求一个对象,待前一个对象接收完毕后再发送对下一个对象的请求。
时间分析
浏览器通常支持并行的TCP连接。并行TCP连接数通常为5~10个。
对多个待获得的web对象,客户端一次可同时建立多个TCP连接,以同时请求多个web对象。
时间分析
某客户和服务器的一次会话中,所有请求/响应对经同一TCP连接传输
HTTP 1.1版本在默认方式下采用持续连接,但也可由客户端/服务器配置为非持续连接。
客户端只有收到前一个响应后才发送新的请求
可理解为同个TCP内的串行
时间分析
客户端只要遇到一个引用对象就尽快发出请求
可理解为同个TCP内的并行
HTTP 1.1的默认选项
时间分析
TCP 三次握手
1.客户向服务器发送一个小TCP报文段;
2.服务器用一个小TCP报文段做出确认和响应;
3.客户向服务器返回确认和一个HTTP请求报文;
4.服务器返回相应HTML文件;
HTTP规范
RFC 1945 , RFC 2616
用ASCII文本书写
HTTP协议有两类消息,请求消息(request)和响应消息(response)
请求行 HTTP请求报文的第一行
方法
首部行 请求行后继的其它行,包含一些会话信息
空行 回车换行,分隔首部行和实体体
实体体(entity body)
GET方法下实体体为空
POST方法下实体体包含表单信息
状态行
常见状态码
首部行
空行
实体体
包含了所请求的对象
HTTP是无状态协议,但cookie技术允许服务器识别用户
cookie在无状态的HTTP之上建立一个用户会话层
参见 [RFC 6265]
cookie组件
cookie技术的争议在于它可能泄露用户的隐私
代表原Web服务器来响应HTTP请求的网络实体
Web缓冲器通常由ISP购买并安装
允许缓存器证实其缓存的副本是新的。
如果缓存器有web对象最新的版本,则初始服务器不需要向缓存器发送该web对象
在HTTP请求消息中声明所持有版本的日期
If-modified-since: <date>
如果缓存的版本是最新的,则响应消息中不包含对象
HTTP/1.0 304 Not Modified
内容分发网络(Content Distribution Network,CDN)
基于缓存器技术,CDN公司在因特网上安装许多地理上分散的缓存器,使得大流量本地化。
有共享CDN(Akamai,Limelight),专用CDN(谷歌,微软)
‘伍’ javaweb里get请求头报文信息含义是什么啊
常见的HTTP报文头属性
Accpet
告诉服务端,客户端接收什么类型的响应
Referer
表示这是请求是从哪个URL进来的,比如想在网上购物,但是不知道选择哪家电商平台,你就去问度娘,说哪家电商的东西便宜啊,然后一堆东西弹出在你面前,第一给就是某宝,当你从这里进入某宝的时候,这个请求报文的Referer就是www..com
Cache-Control
对缓存进行控制,如一个请求希望响应的内容在客户端缓存一年,或不被缓可以通过这个报文头设置
Accept-Encoding
例如:Accept-Encoding:gzip, deflate(这两种都是压缩格式)
这个属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩形式(一般都是压缩形式)
Host
指定要请求的资源所在的主机和端口
User-Agent 作用:告诉服务器,客户端使用的操作系统、浏览器版本和名称
‘陆’ Web 浏览器向侦听标准端口的 Web 服务器发出请求之后,在服务器响应的 TCP 报头中,源端口号是多少
当然是80端口了。标准web应用必然是采用80端口,响应报文源端口就是指服务器端口,所以肯定是80端口。
‘柒’ web服务器上一个大小为22KB的网页,假设TCP最大报文长度是1KB,浏览器与web服务器之间的往返RTT为100ms
客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成功的,那么当第4个RTT时间内发送的所有TCP段都得到了ACK时,拥塞窗口大小是:9KB
‘捌’ WEB揭秘之长连接,短连接,长轮询,短轮询
客户端与服务端之间建立通信需要经过该三次握手:
客户端建立连接(发送syn报文)->服务端发送确认信息(发送syn+ack报文)->客户端接收确认信息。因此通过tcp建立了客户端与服务端的连接。
http通信通过tcp建立连接一般都是短连接,客户端与服务器之间建立了一次通信后就要断开连接,当再次需要进行通信的时候就要再次通过tcp建立连接.
通过tcp建立Http长连接,就解决了短连接的弊端,当建立了客户端和服务器端的连接后,就会保持这个连接,但是不会断开,后续通信可继续使用这个长连接。但是长连接会对服务器端造成非常大的压力,因为长连接不关闭的话会越来越多。解决这种风险可以设置最大长连接数,服务器端也可以关闭一些长时间无操作的连接。
短轮询是建立在http通信的基础上。当服务器端的数据在实时更新想要向客户端推送时,就会用到轮询这种方式。因为客户端只能主动向服务器端发送请求获取数据,但是要服务端主动发送数据给客户端,就可以在客户端不断的发送请求给服务器端,服务器端不管有没有数据都会返回数据。保持客户端不断发送请求的方法是设置一个定时器不断调用某个函数.
然而短轮询的缺点也显而易见,这样不断的请求数据就会造成服务器端的压力,并且如果设置超时过短就会获得脏数据.
长轮询是对短轮询的一种提升,当客户端不断地向服务器端请求数据的时候,若有数据则返回,没有数据返回的情况都要hold on ,直到timeout。这种解决办法一定程度上解决了服务器端的压力,但是如果进程过多,也会成为问题.
这是最近对浏览一些博客最基本的了解,以后如果有更深层次的了解将会继续修改。
‘玖’ webrtc P2P之turn协议介绍
TURN的全称为Traversal Using Relays around NAT,是STUN/RFC5389的一个拓展,主要添加了Relay功能。如果终端在NAT之后,那么在特定的情景下,有可能使得终端无法和其对等端(peer)进行直接的通信,这时就需要公网的服务器作为一个中继, 对来往的数据进行转发。这个转发的协议就被定义为TURN。TURN和其他中继协议的不同之处在于,它允许客户端使用同一个中继地址(relay address)与多个不同的peer进行通信。
使用TURN协议的客户端必须能够通过中继地址和对等端进行通讯,并且能够得知每个peer的的IP地址和端口(确切地说,应该是peer的服务器反射地址)。而这些行为如何完成,是不在TURN协议范围之内的。其中一个可用的方式是客户端通过email来告知对等端信息,另一种方式是客户端使用一些指定的协议,如“introction” 或 “rendezvous”,详见RFC5128
如果TURN使用于ICE协议中,relay地址会作为一个候选,由ICE在多个候选中进行评估,选取最合适的通讯地址。一般来说中继的优先级都是最低的。TURN协议被设计为ICE协议(Interactive Connectivity Establishment)的一部分,而且也强烈建议用户在他们的程序里使用ICE,但是也可以独立于ICE的运行。值得一提的是,TURN协议本身是STUN的一个拓展,因此绝大部分TURN报文都是STUN类型的,作为STUN的一个拓展,TURN增加了新的方法(method)和属性(attribute)。
在典型的情况下,TURN客户端连接到内网中,并且通过一个或者多个NAT到达公网,TURN服务器架设在公网中,不同的客户端以TURN服务器为中继和其他peer进行通信,如下图所示:
在上图中,左边的TURN Client是位于NAT后面的一个客户端(内网地址是10.1.1.2:49721),连接公网的TURN服务器(默认端口3478)后,服务器会得到一个Client的反射地址(Reflexive Transport Address, 即NAT分配的公网IP和端口)192.0.2.1:7000,此时Client会通过TURN命令创建或管理ALLOCATION,allocation是服务器上的一个数据结构,包含了中继地址的信息。服务器随后会给Client分配一个中继地址,即图中的192.0.2.15:50000,另外两个对等端若要通过TURN协议和Client进行通信,可以直接往中继地址收发数据即可,TURN服务器会把发往指定中继地址的数据转发到对应的Client,这里是其反射地址。
Server上的每一个allocation都唯一对应一个client,并且只有一个中继地址,因此当数据包到达某个中继地址时,服务器总是知道应该将其转发到什么地方。但值得一提的是,一个Client可能在同一时间在一个Server上会有多个allocation,这和上述规则是并不矛盾的。
在协议中,TURN服务器与peer之间的连接都是基于UDP的,但是服务器和客户端之间可以通过其他各种连接来传输STUN报文,比如TCP/UDP/TLS-over-TCP. 客户端之间通过中继传输数据时候,如果用了TCP,也会在服务端转换为UDP,因此建议客户端使用
UDP来进行传输. 至于为什么要支持TCP,那是因为一部分防火墙会完全阻挡UDP数据,而对于三次握手的TCP数据则不做隔离.
要在服务器端获得一个中继分配,客户端须使用分配事务. 客户端发送分配请求(Allocate request)到服务器,然后服务器返回分配成功响应,并包含了分配的地址.客户端可以在属性字段描述其想要的分配类型(比如生命周期).由于中继数据实现了安全传输,服务器会要求对客户端进行验证,主要使用STUN的long-term credential mechanism.
一旦中继传输地址分配好,客户端必须要将其保活.通常的方法是发送刷新请求(Refresh request)到服务端.这在TURN中是一个标准的方法.刷新频率取决于分配的生命期,默认为10分钟.客户端也可以在刷新请求里指定一个更长的生命期,而服务器会返回一个实际上分配的时间. 当客户端想中指通信时,可以发送一个生命期为0的刷新请求.
服务器和客户端都保存有一个成为五元组(5-TUPLE)的信息,比如对于客户端来说,五元组包括客户端本地地址/端口,服务器地址/端口,和传输协议;服务器也是类似,只不过将客户端的地址变为其反射地址,因为那才是服务器所见到的. 服务器和客户端在分配
请求中都带有5-TUPLE信息,并且也在接下来的信息传输中使用,因此彼此都知道哪一次分配对应哪一次传输.
如上图所示,客户端首先发送Allocate请求,但是没带验证信息,因此STUN服务器会返回error response,客户端收到错误后加上所需的验证信息再次请求,才能进行成功的分配.
client和peer之间有两种方法通过TURN server交换应用信息,第一种是使用Send和Data方法(method),第二种是使用通道(channels),两种方法都通过某种方式告知服务器哪个peer应该接收数据,以及服务器告知client数据来自哪个peer.
Send Mechanism使用了Send和Data指令(Indication).其中Send指令用来把数据从client发送到server,而Data指令用来把数据从server发送到client.当使用Send指令时,客户端发送一个Send Indication到服务端,其中包含:
当服务器收到Send Indication之后,会将DATA部分的数据解析出来,并将其以UDP的格式转发到对应的端点去,并且在封装数据包的时候把client的中继地址作为源地址.从而从对等端发送到中继地址的数据也会被服务器转发到client上.值得一提的是,Send/Data Indication是不支持验证的,因为长效验证机制不支持对indication的验证,因此为了防止攻击,TURN要求client在给对等端发送indication之前先安装一个到对等端的许可(permission),如下图所示,client到Peer B没有安装许可,导致其indication数据包将被服务器丢弃,对于peer B也是同样:
TURN支持两种方式来创建许可,一种是发送CreatePermission request
对于一些应用程序,比如VOIP(Voice over IP),在Send/Data Indication中多加的36字节格式信息会加重客户端和服务端之间的带宽压力.为改善这种情况,TURN提供了第二种方法来让client和peer交互数据.该方法使用另一种数据包格式,即ChannelData message,信道数据报文. ChannelData message不使用STUN头部,而使用一个4字节的头部,包含了一个称之为信道号的值(channel number).每一个使用中的信道号都与一个特定的peer绑定,即作为对等端地址的一个记号.
要将一个信道与对等端绑定,客户端首先发送一个信道绑定请求(ChannelBind Request)到服务器,并且指定一个未绑定的信道号以及对等端的地址信息.绑定后client和server都能通过ChannelData message来发送和转发数据.信道绑定默认持续10分钟,并且可以通过重新发送ChannelBind Request来刷新持续时间.和Allocation不同的是,并没有直接删除绑定的方法,只能等待其超时自动失效.
上图中0x4001为信道号,即ChannelData message的头部中头2字节,值得一提的是信道号的选取有如下要求:
在上一章也提到过,因为RFC是标准协议,因此实现上往往有良好的兼容性和拓展性.现存的开源P2P应用程序,如果按照标准来设计,可以很容易与之对接.其中比较着名的就是PJSIP,PJSIP是一个开源的多媒体通信库,实现了许多标准协议,如SIP, SDP, RTP, STUN, TURN 和 ICE. 当然我们也能自己实现.比如GitHub上的TurnServer就是其中一个对TURN服务端的实现.下面在局域网环境下对TURN数据包进行简要分析.首先有如下机器情况:
这里使用wireshark来抓包分析,首先TurnClient发送Allocation请求:
可以看到第一次requst被服务器拒绝,因为后者要求nonce验证信息,服务器的返回中包含了nonce信息,除此之外还包含了ERROR-CODE,SOFTWARE,FINGERPRINT属性.
在下一次request请求中,客户端加上了收到的nonce,以及USERNAME和REALM等属性,再次发送到TurnServer:
服务器如果通过验证,就会返回success response,随后Client可以通过上文说到的两种方法与Peer进行通讯,比如下面的Send indication方法:
‘拾’ WEBRTC基本概念
AIMD英文全称:Additive Increase Multiplicative Decrease。TCP/IP模型中,属于[运输层],为了解决[拥塞控制]的一个方法,即:加性增,乘性减,或者叫做“和式增加,积式减少”。
aimd controller是TCP底层的码率调节概念,但是WebRTC并没有完全照搬TCP的机制,而是设计了套自己的算法。
如果处于Incr状态,增加码率的方式分为两种:一种是通信会话刚刚开始,相当于TCP慢启动,它会进行一个倍数增加,当前使用的码率乘以系数,系数是1.08;如果是持续在通信状态,其增加的码率值是当前码率在一个RTT时间周期所能传输的数据速率。
如果处于Decrease状态,递减原则是:过去500ms时间窗内的最大acked bitrate乘上系数0.85,acked bitrate通过feedback反馈过来的报文序号查找本地发送列表就可以得到。
aimd根据上面的规则最终计算到的码率就是基于延迟拥塞评估到的bwe bitrate码率。
WebRTC在发送端收到来自接收端的RTCP RR报文,根据其Report Block中携带的丢包率信息,动态调整发送端码率As。
基于延迟的码率控制运行在接收端,WebRTC根据数据包到达的时间延迟,通过到达时间滤波器,估算出网络延迟m(t),然后经过过载检测器判断当前网络的拥塞状况,最后在码率控制器根据规则计算出远端估计最大码率Ar。然后,通过RTCP REMB报文返回Ar等到发送端。
发送端综合As、Ar和预配置的上下限,计算出最终的目标码率A,该码率会作用到Encoder、RTP和PacedSender等模块,控制发送端的码率。
GCC算法充分考虑丢包率和延迟对码率的影响,在实时通讯应用(如视频会议)中能够发挥良好效果。然而,在某些特定应用场景下(比如实时在线编辑),GCC算法的表现不太让人满意,主要体现在它应对峰值流量的能力上,具体表现在:
1)算法一开始基于Increase状态增加码率,当检测到Decrease状态时调用Ar[t(i)] = Alpha * Rr[t(i)],这个时候实时码率Rr(ti)可能远小于Ar[t(i-1)],这样在后续过程中Ar处于较低水平;此时若有视频关键帧冲击,则数据包大量在PacedSender的队列中排队,造成较大排队延迟。
2)基于1)中论述的情况,码率估计模块反馈给Codec的编码码率很低,但编码器需要编码关键帧时,内部的码率控制模块控制出的最小码率仍然大于反馈码率。这两种情况都会造成较大的发送端排队延迟,进而在接收端造成较大的JitterBuffer延迟,最终导致端到端延迟到达500ms的水平,这在实时在线编辑应用中是无法容忍的。
基于此,Google官方从WebRTC M55开始引入新的码率估计算法,把所有码率计算模块都移动到发送端,并采用全新的Trendline滤波器,基于码率探测机制快速准确地估计出实时码率。
WebRTC在评估延迟差的时候不是对每个包进行估算,而是采用了包组间进行延迟评估,这符合视频传输(视频帧是需要切分成多个UDP包)的特点,也减少了频繁计算带来的误差。那么什么是包组呢?就是距包组中第一个包的发送时刻t0小于5毫秒发送的所有的包成为一组,第一个超过5毫秒的包作为下一个包组第一个包。