TCP与UDP(七)

TCP/IP 系列文章

网络基础知识(一)
TCP/IP基础知识(二)
物理层(三)
数据链路层(四)
IP 协议(五)
IP 协议相关技术(六)
TCP与UDP(七)

一、传输协议层

1.1 两种传输层协议 UDP 和 TCP

在 TCP/IP 中能够实现传输功能的,并具有代表性的协议是 TCP 和 UDP 这两个协议。两者都是流协议,你可以把它想象成排水管中的水流。

TCP 协议能够正确处理丢包问题,保证接收方能够收到数据,与此同时还能够有效利用网络带宽。然而 TCP 协议中定义了很多复杂的规范,因此效率不如 UDP 协议,不适合实时的视频和音频传输。

UDP 协议是面向无连接的协议,它只会把数据传递给接收端,但是不会关注接收端是否真的收到了数据。但是这种特性反而适合多播,实时的视频和音频传输。因为个别数据包的丢失并不会影响视频和音频的整体效果。

1.2.1 UDP 首部

UDP 的首部结构比较简单,如下图所示。



UDP 首部包含源端口号、目标端口号、包长度和校验和。其中包长度表示 UDP 首部的长度和 UDP 数据长度之和。另外,校验和用来判断数据在传输过程中是否损坏。计算这个校验和的时候,不仅考虑源端口号和目标端口号,还要考虑 IP 首部中的源 IP 地址,目标 IP 地址和协议号(这些又称为 UDP 伪首部)。这是因为以上五个要素用于识别通信时缺一不可,如果校验和只考虑端口号,那么另外三个要素收到破坏时,应用就无法得知。这有可能导致不该收到包的应用收到了包,该收到包的应用反而没有收到。这个概念同样适用于即将介绍的 TCP 首部。

1.2.2 TCP 首部
TCP 首部

毫无疑问,TCP 首部的结构要比 UDP 复杂的多。这也是 TCP 传输速度低于 UDP 的重要原因之一。

  • 序列号:它表示发送数据的位置,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在建立连接时通常由计算机生成一个随机数作为序列号的初始值。

  • 确认应答号:它等于下一次应该接收到的数据的序列号。假设发送端的序列号为 s,发送数据的长度为 l,那么接收端返回的确认应答号也是 s + l。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收。

  • 数据偏移:TCP 首部的长度,单位为 4 字节。如果没有可选字段,那么这里的值就是 5。表示 TCP 首部的长度为 20 字节。

  • 控制位:改字段长度为 8 比特,分别有 8 个控制标志。依次是 CWR,ECE,URG,ACK,PSH,RST,SYN 和 FIN。在后续的文章中你会陆续接触到其中的某些控制位。

  • 窗口大小:用于表示从应答号开始能够接受多少个 8 位字节。如果窗口大小为 0,可以发送窗口探测。

  • 紧急指针:尽在 URG 控制位为 1 时有效。表示紧急数据的末尾在 TCP 数据部分中的位置。通常在暂时中断通信时使用(比如输入 Ctrl + C)。

1.2 关于端口号(扩充)

首先要知道,只有在目标地址、原地址、目标端口号、源端口号以及协议类型(TCP 还是 UDP)这五项内容都一致的时候才被认为是同一个通信连接。


服务端程序在 UNIX 系统中叫做守护进程。如 HTTP 的服务端程序是 httpd(HTTP 守护进程),而 sshd (SSH 守护进程)。在 UNIX 中并不需要将这些守护进程逐个启动,而是启动一个可以代表他们接收到客服端请求的 inetd(互联网进程)服务程序即可。传输协议 TCP 、UDP 通过接受数据中的目标端口号识别处理程序。

二、TCP 连接和断开(三次连接,四次挥手断开连接)

关于 TCP 连接和断开连接的过程,可以参考下图。


连接和断开连接

2.1 关于三次握手连接

三次握手建立连接流程:
  • 1、(客户端):我要建立连接了。
  • 2、(服务端):我知道你要建立连接了,我这边没有问题。
  • 3、(客户端):我知道你知道我要建立连接了,接下来我们就正式开始通信。
为什么要三次握手,尤其是为何执行第三步?

一般的思路可能会觉得只要两次握手就可以了,第三步确认似乎是多余的。其实不然,网络是不可靠的,数据包是可能丢失的。假设没有第三次确认,客户端向服务端发送了 SYN 请求建立连接。由于延迟,服务端没有及时收到这个包。于是客户端重新发送一个 SYN 包。假设服务端接收到了第二个 SYN 包,建立了通信,一段时间后通信结束,连接被关闭。这时候最初被发送的 SYN 包刚刚抵达服务端,服务端又会发送一次 ACK 确认。由于两次握手就建立了连接,此时的服务端就会建立一个新的连接,然而客户端觉得自己并没有请求建立连接,所以就不会向服务端发送数据。从而导致服务端建立了一个空的连接,白白浪费资源。但是在有了第三步确认时情况就不一样了,服务端直到收到客户端的应答后才会建立连接。如果客户端接受到一个相同的 ACK 包,这时候它会抛弃这个数据包,不会和服务端再次进行,因此避免了服务端建立空的连接。

建立连接过程中, ACK 确认丢失后,TCP 协议是如何处理?

按照 TCP 协议处理丢包的一般方法,服务端会重新向客户端发送数据包,直至收到 ACK 确认为止。但实际上这种做法有可能遭到 SYN 泛洪攻击。所谓的泛洪攻击,是指发送方伪造多个 IP 地址,模拟三次握手的过程。当服务器返回 ACK 后,攻击方故意不确认,从而使得服务器不断重发 ACK。由于服务器长时间处于半连接状态,最后消耗过多的 CPU 和内存资源导致死机。

正确处理方法是服务端发送 RST 报文,进入 CLOSE 状态。这个 RST 数据包的 TCP 首部中,控制位中的 RST 位被设置为 1。这表示连接信息全部被初始化,原有的 TCP 通信不能继续进行。客户端如果还想重新建立 TCP 连接,就必须重新开始一次握手。

2.2 关于四次挥手断开连接

四次挥手断开连接过程:
  • 1、(客户端):我要关闭连接了。
  • 2、(服务端):你那边的连接可以关闭了。
  • 3、(服务端):我这边也要关闭连接了。
  • 4、(客户端):你那边的连接可以关闭了。
为什么都要执行关闭操作?

因为连接是双向的,所以双方都要主动关闭自己这一侧的连接。

ACK 丢失怎么办?

在第三步中,客户端收到 FIN 包时,会设置一个计时器,等待相当长的一段时间。如果客户端返回的 ACK 丢失,那么服务端还会重发 FIN 并重置计时器。假设在计时器失效前服务器重发的 FIN 包没有到达客户端,客户端就会进入 CLOSE 状态,从而导致服务端永远无法收到 ACK 确认,也就无法关闭连接。

三、TCP 数据包重发

丢失数据包再次重发的前提是发送方能够知道接收方是否成功的接收了消息。

通过序列号和确认应答提高可靠性

TCP 中,当发送端的数据到达接收端时,接收端会返回一个已收到消息的回执通知,该回执通知叫做确认应答 ACK 。根据 上面对 TCP 首都的分析可知,该 ACK 的值和发送端下次发送数据包在整个发送数据中的序列号相等。更明确的说,ACK 除了告诉发送端已经接收到了当前数据包,还告诉发送端下次发送数据要从那个位置开始发。如下示意图。

然而,实际情况并不总是那么尽如人意。比如下面这两个问题:
1、因为网络问题,如果数据包和 ACK 应答都丢失,怎么办?
此时,发送方如果在一段时间内没有收到 ACK,就会重发数据。
2、由于网络延迟的存在,接收方收到重复的数据包怎么办?
通过 TCP 首部中的 SYN 判断这个数据包是否曾经接收过。如果已经接收过,就会丢弃这个包。

未收到ACK重发过程

TCP 窗口

发送端在数据包发出后,直至 ACK 确认返回以前,发送端都无法发送数据,显然是一种浪费,网络利用效率和通信性能就越低。这一问题在 TCP 中通过引入”窗口“的概念得以被解决。

利用窗口控制提高速度

”窗口大小“表示无需等待确认应答ACK返回之前,可以继续发送数据包的最大数量。

窗口的控制和重发控制

以下示意图是窗口控制的概念。


  • 在使用窗口控制的过程中,如果是数据包已经到达对端,但是确认应答却没有返回该怎么办?这就是窗口最擅长处理的问题了。假设发送发收到的确认包中的 ACK 第一次是 1001,第二次是 4001。那么我们完全可以相信中间的两个包是成功被接收的。因为如果有没接收到的包,接收方是不会增加 ACK 的。而在没有窗口控制的条件下,发送方就会重发第二个和第三个数据包。如下图所示。


    ACK丢失的情况
  • 在使用窗口控制的过程中,如果是数据包丢失该怎么办?接收端主机如果接收到一个自己应该接受序号以外的数据,此时只会针对在此之前收到数据返回确认应答ACK。如下图,当1001 - 2000 的数据包丢失时,发送端会一直收到系列号为 1001 的确认应发,这个确认应答就好像接收端一直在提醒发送端:“我想接收的是从 1001 开始的数据”。当发送端如果连续 3 次收到同样的确认应答,此时就会针对确认应答序列号发送对应的数据,这种机制被称作高速重发控制。相对于超时重发机制管理更加有效。如下图所示。

高速重发机制

补充

TCP 和 UDP 的区别

  • TCP 借助滑动窗口协议或早期的停止等待协议,可靠传输。UDP 属于不可靠传输,但是在 UDP 的基础之上,自己处理可以变为可靠传输,如 QQ 的底层通信是借助 UDP。
  • TCP 具有流量控制功能。流量控制就是让发送方的放松速率不要太快,要让接收方来得及接收。接收方除了告诉发送方下一个数据序号之外,还会让发送方调整发送窗口大小。
  • TCP 具有网络拥塞控制功能。 拥塞控制主要是为了防止过多数据注入网络中,当发送方迟迟不能收到对方的消息时,猜想当前网络某处发生了拥塞。发送方就会通过慢开始和拥塞避免机制去控制窗口大小。当发生网络拥塞时,从1指数型增长窗口大小,当增到特定的时候,再线性增加滑动窗口;当再次发生拥塞时,继续重复之前步骤。

HTTP 如何实现可靠传输?

参考 TCP 可靠传输

HTTPS 中间人怎么攻击的?

针对SSL的中间人攻击方式主要有两类,分别是SSL劫持攻击和SSL剥离攻击:

SSL劫持攻击

SSL劫持攻击即SSL证书欺骗攻击,攻击者为了获得HTTPS传输的明文数据,需要先将自己接入到客户端和目标网站之间;在传输过程中伪造服务器的证书,将服务器的公钥替换成自己的公钥,这样,中间人就可以得到明文传输带Key1、Key2和Pre-Master-Key,从而窃取客户端和服务端的通信数据;

但是对于客户端来说,如果中间人伪造了证书,在校验证书过程中会提示证书错误,由用户选择继续操作还是返回,由于大多数用户的安全意识不强,会选择继续操作,此时,中间人就可以获取浏览器和服务器之间的通信数据

SSL剥离攻击

这种攻击方式也需要将攻击者设置为中间人,之后见HTTPS范文替换为HTTP返回给浏览器,而中间人和服务器之间仍然保持HTTPS服务器。由于HTTP是明文传输的,所以中间人可以获取客户端和服务器传输数据


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,037评论 6 174
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,051评论 0 8
  • 计算机网络七层模型中,传输层有两个重要的协议:(1)用户数据报协议UDP (User Datagram Proto...
    Q南南南Q阅读 1,703评论 0 3
  • 传输层-TCP, TCP头部结构 ,TCP序列号和确认号详解 TCP主要解决下面的三个问题 1.数据的可靠传输...
    抓兔子的猫阅读 4,502评论 1 46
  • 1 运输层协议概述 1.1 进程之间的通信 网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑...
    Mr希灵阅读 8,072评论 0 34