vivo手机能恢复出厂设置吗设置怎样能

到底什么是TCP连接? - 博客频道 - CSDN.NET
中华胡杨的专栏
分类:想到哪写到哪
这个问题说实话困扰了我接近2年时间,我们找到的所有资料上都写着,TCP是面向连接的服务,所有要通过TCP进行通信的应用都要先建立连接才能通信,在通信完毕之后要记得关闭连接。直到前不久才突然搞明白,这里记录下来,文章写得也许不够特别准确,但是我觉得对于理解整个建立过程是足够了。
这里先说结论,连接实际上是操作系统内核的一种数据结构,称为TCP控制块(TCB),对于linux而言是tcp_sock结构。不光连接,连数据包也是由一个数据结构来控制,linux里面称为sk_buff结构。
为什么需要TCB
当应用希望写数据时,并不是直接向网卡驱动发数据,而是先放入到一个缓冲区中,然后根据一定算法(达到一定数量或者调用flush之后),缓冲区中的数据就经发送到网卡中了(这里说的不准确,实际上,是网卡主动从缓冲区中拷贝出来的,但并不影响我们理解)。
当网卡收到数据时,数据包要先经过如下几步:
数据包要先经过网卡校验正确与否。
数据链路层根据报头的类型传给不同的上层类型(IP层或者其他),并移除了数据链路层报头。
IP层也需要先校验,然后根据IP报头选择不同的类型(TCP或者UDP),然后移除IP层报头,并将剩余的数据发送到相应的处理程序(tcp或udp)
到了tcp层,处理程序此时根据tcp首部中的端口号选择一个socket,并将其载荷数据拷贝进去。
所以到这里,我们就应该知道,每个socket必须要有自己独立的发送缓冲区和接收缓冲区,并且还应该还有其他控制结构或者标示结构,这就构成了TCB,没有TCB,接收到的数据根本就不知道要传递到哪里?
对了,有一句话在这里没说,就是网卡收到的数据是以数据流的形式,然后在到某层(忘了)的时候,它会负责将数据流构造成一个操作系统可以认识的数据结构的形式,这样对操作系统操作会非常方便。
为什么说四元组是连接的唯一标识
我们可能已经多次看到这样一种说法:一个tcp连接由一个连接四元组唯一标识。连接四元组是指&\source ip,source port,target ip,target port&。
为什么需要四元组,我们就不多说了,如果四个元素缺少任何一个都会发生冲突。那在网络接收过程中是如何利用到这四元组呢?
看了上个部分,你可能会有种错觉,是网卡一步一步向上传递的。其实严格说并不是这样,当网卡收到数据之后,首先经过校验没有错误之后,通过DMA直接发送到内存缓冲区中,然后给CPU发送一个中断信号,通知操作系统一个数据包到了。
注意:这里面的内存缓冲区并不是socket的接收缓冲区,而是网卡驱动提前向操作系统申请的一块内存,并且驱动会提前告诉网卡这块内存的地址(注意是物理地址)和大小。如果没有这块内存缓冲区,那么网卡会直接将数据丢掉。
在操作系统获悉到一个数据包来到之后,就利用中断函数来一步步执行并解析数据包,知道TCP层,到了TCP层,TCP要决定将数据包发给那个socket的接收缓冲区。
怎么找?这里TCP就是利用连接四元组,并以这个四元组为key,查找hash表找到对应的socket的socket结构指针,并利用该指针找到对应socket的接收缓冲区,并将载荷数据拷贝进去。
所以,如果想发动攻击,那么直接填写一个对方IP和对方运行服务的端口号,并发送数据,这样是无效的,除了会拥塞网络外,因为没有这样的四元组,所以TCP协议会不知道把载荷数据发给哪个缓冲区。
所以,一种常见的攻击是SYN洪水,它的原理就是,此时服务器会产生大量的socket结构,大量的占据内存,然而并没有ACK数据到达,这样,如果有成千上万个SYN请求,那服务器的内存很快就会耗完,服务器也就down了。
HTTP短连接和长连接
了解了上面的内容之后,才能真正懂得到底什么是短连接和长连接(持久连接)。这里面并没有什么特别复杂的技术。
对于HTTP 1.0的http标准而言,默认连接是短连接,啥叫短连接?就是服务器当发送完最后一个字节的数据之后将关闭连接,也就是回收tcp_sock结构,这样,如果客户端再发送数据给服务器,将直接丢弃。即使此时客户端还有这样的结构,但是我们说连接已经关闭或者已经断了。
那客户端知不知道啥时候服务器的连接关闭?不知道,双方可以在任何时候来关闭自己的连接而没有必要通知对方。不过,对于短连接而言,通知不通知也没有意义了。
那短连接的弊端,大家可能都已经知道了,如果对一个服务器要连续发送多个请求,还需要为每次请求建立新的连接。
为了降低建立连接的时间,HTTP 1.1引入了长连接的概念,并把它搞成了默认的连接方式。啥叫长连接?就是当完成一个业务之后,socket结构并不回收。这样,只要在socket结构还存在的时候,客户端发送的任何数据,服务器都可以收到,这就是所谓的长连接。
相比短连接而言,长连接并没有什么特别的新的技术,只是维护socket结构时间长了。因为,说http长连接更不如说是tcp长连接。
还有一种连接方式是pipeline,或者叫管道化连接。这又是一种啥呢?实际上,管道化连接是一种特殊形式的长连接。我们知道长连接节约了建立连接的时间,但是对于连续N个请求,我们还是需要等前一个响应收到之后才能发送下一个请求,如果在一个timeline上看,有点象一个锯齿。那我们知道网络传输的时间是很长的,那如果我们需要发起N个请求,客户端到服务器的传输时间为t,那总的时间为N*t*2;
如何缩短这部分时间呢?有人想到了个很自然的方法,我可不可以不等前一个响应回来就直接发送请求?在timeline图中就像在一个管子里不停的发请求,至于服务器的状态,我也根本不在乎。
管道化连接的方法的确降低了网络传输时间,但是它可能也引入了新的问题。因为客户端并不知道服务器啥时候关闭连接,那有可能管道里的请求,server处理了一部分就关闭了。但是客户端并不知道server处理了哪些?客户端只能选择重新建立连接并重传这些请求。如果这些请求全是对静态数据的请求也就罢了,如果是动态post数据,比如一个订单数据,再不幸的是server已经处理了这个数据,再来一份数据,server将再会处理一遍。这对用户实际的意图讲相差甚远。
也正是这个原因,管道化连接最好不要轻易使用。
啰里啰嗦说了这么多,基本上是想到哪写到哪,肯定有不详之处,也肯定有不够准确的地方,希望不吝赐教。祝七夕快乐~
最后推荐一篇博客:
排名:第6183名
(4)(244)(15)(4)(13)(10)(5)(2)(3)(5)(12)(2)TCP 杩炴帴闄愬埗锛岃繖鏄?粈涔堟剰鎬濓紵銆愮櫨搴︿笅鍚у惂銆慱鐧惧害璐村惂
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&绛惧埌鎺掑悕锛氫粖鏃ユ湰鍚х?涓??鍒帮紝鏈?惂鍥犱綘鏇寸簿褰╋紝鏄庡ぉ缁х画鏉ュ姫鍔涳紒
鏈?惂绛惧埌浜烘暟锛

我要回帖

更多关于 vivo手机能恢复出厂设置吗 的文章

 

随机推荐