§5.1 传输层概述
一、传输层
1.概念:
首先只有主机曾有传输层和上面的应用层,其他的网络设备,例如中继器路由器什么的,他最多只能到数据链路层。
通过第一章的知识,我们可知,传输层为应用层提供通信服务。同时使用网络层提供的服务。
2.功能:
① 传输层提供进程和进程之间的逻辑通信。
② 复用和分用。(发复收分)
③ 对收到的报文进行差错检测。(首部校验和只是校验头部,并不对数据部分进行校验,数据监测交付给了高层。正是因为网络层检验了数据部分,所以网络层只需要检测头部。)
二、传输层的两个协议
1.分类:
面向连接的传输控制协议TCP和无连接的用户数据包协议UDP。
2.TCP协议:
传送数据之前必须建立连接,数据传送结束后要释放连接。不提供广播或多播服务。由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销:确认、流量控制、计时器及连接管理等。
可靠,面向连接,时延大,适用于大文件。
3.UDP协议
传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。
不可靠,无连接,时延小,适用于小文件。
三、传输层的寻址与端口
1.端口的概念:
为实现传输层的 复用 ,即应用层所有的应用进程都可以通过传输层再传输到网络层,以及 分用 ,即传输层从网络层收到数据后交付指明的应用进程。我们存在了 端口号 这一概念。
端口 是传输层的SAP,标识主机中的应用进程,他是一种逻辑端口,不同与硬件上的端口的概念。
端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的。
另外,端口号长度为16bit,能表示65536个不同的端口号。
在网络中采用发送方和接收方的套接字组合来识别端点, 套接字 唯一标识了网络中的一个主机和它上面的一个进程。套接字 = (主机IP地址,端口号)
2.端口的分类:
-
服务端 使用端口号
- 熟知端口号(0~1023):端口号长度为16bit,能表示65536个不同的端口号。
- 登记端口号(1024~49151):
-
客户端 使用的端口号(49152~65535):仅在客户进程运行时才动态选择。
四、 应用程序及其熟知端口号
应用程序 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | SNMP |
---|---|---|---|---|---|---|---|
熟知端口号 | 21 | 23 | 25 | 53 | 69 | 80 | 161 |
§5.2 UDP协议
一、用户数据包协议UDP概述
1.概念:
UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。
2.特点:
① UDP是 无连接 的,减少开销和发送数据之前的时延。
② UDP使用最大努力交付,即 不保证可靠交付 。
③ UDP是面向报文的,适合一次性传输少量数据的网络应用。也就是说应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整报文。所以UDP协议必须传播大小合适的报文。
④ UDP没有拥塞控制,适合很多实时应用。(看直播可能就会卡,因为他是UDP)
⑤ UDP首部开销小,8B,而TCP是20B。
二、UDP首部格式
① UDP长度:整个数据报的长度。
② UDP检验和:检测整个UDP数据报是否有错,错就丢弃。
分用时,找不到对应的目的端口号,就丢弃报文,并给发送方发送ICMP“端口不可达”差错报告报文。
三、UDP校验
1.何为伪首部:
伪首部里的那个17是UDP的网络协议号。
伪首部只有在计算检验和时才出现,不向下传送也不向上递交。
UDP长度是UDP首部的8B加上数据部分的长度(不包括伪首部)。
2.如何利用伪首部检验数据报是否有差错:
在发送端:
1.填上伪首部。
2.全0填充校验和字段。
3.全零填充数据部分(数据部分必须是四字节的整数倍,若不是,就用全0填充)
4.伪首部 + 首部 + 数据部分采用二进制反码求和。
5.把和求反码填入检验和字段。
6.去掉伪首部,发送数据报。
在接收端:
1.填上伪首部。
2.伪首部 + 首部 + 数据部分采用二进制反码求和。
3.结果全为1则无差错,否则丢弃数据报/交给应用层附上出差错的警告。
§5.3.1 TCP协议的特点和TCP报文段
一、TCP特点
1.TCP是一种面向连接(虚连接)的协议。
2.每一条TCP连接只能有两个端点,也就是说每一条TCP连接都必须是点对点的。因而无法应用于广播多播。
3.TCP提供可靠交付的服务,无差错、不丢失、不重复、按序送达。保证可靠有序,不丢不重。
4.TCP提供全双工通信。因而接收双方都提供发送缓存和接收缓存。发送缓存包含的数据有准备发送的数据&已发送但尚未收到确认的数据,而接收缓存中包含有按序到达但尚未被接受应用程序读取的数据&不按序到达的数据。
5.TCP是面向字节流的。即TCP把应用程序交下来的数据看成仅仅是一连串的 无结构的字节流 。(流指的是流入到进程或从进程流出的字节序列。)
二、TCP报文段首部格式
① 序号:在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的**第一个字节的序号。**就是说把这个文件每个字节都标上好,第一次发送的,序号是1,然后比如这次发了n个字节,那下一次就是从n + 1开始了,序号就是n + 1了。
② 确认号: 期望 收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。
③ 数据偏移 (首部长度) :TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B位单位,即1个数值是4B。首部不一定就是20字节,也可能加了一些选项和填充字段。
④ 紧急位URG:URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在TCP发送缓存里排队,插队直接当第一个,配合紧急指针字段使用。
⑤ 确认位ACK:ACK=1时确认号字段才有效,在连接建立后所有传送的报文段都必须把ACK置为1。
⑥ 推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。TCP的接收方缓存要等到缓存区满了以后才向上交付给应用层中的进程,如果报文段德推送位为1,那就直接交付,不用等。
⑦ 复位RST:RST=1时,表明TcP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。也可以用来拒绝连接。
⑧ 同步位SYN: SYN=1时,表明是一个连接请求/连接接受报文。
⑨ 终止位FIN:FIN=1时,表明此报文段发送方数据已发完,要求释放连接。
⑩ 六个控制位:即④~⑨。其中⑥⑦几乎不考。
⑪ 窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。发送方接收到发送方的窗口字段后,也就知道如何设置自己的缓存大小。如果说接收方确认号为701,而他的窗口是1000,那么发送方的缓存就应该存放701~1700.
⑫ 检验和:检验首部+数据,检验时要加上12B伪首部,第四个字段,也就是TCP的协议号为6。
⑬ 紧急指针: URG=1时才有意义,指出本报文段中紧急数据的字节数。若为50,则数据部分第1~50字节是紧急数据。
⑭ 选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认…MSS是数据字段的最大长度。
§5.3.2 TCP连接管理
一、TCP连接管理
1.TCP连接传输的三个阶段:
连接建立
数据传送
连接释放
TCP连接的建立采用 客户服务器方式 ,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。虽然角色不同,但他们都可以接发数据。
假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:
PS:ack是确认号,而seq是序号。
第一次握手:客户端发送 连接请求报文段 ,无应用层数据。SYN=1,seq=x(随机)
第二次握手:服务器端为该TCP连接 分配缓存和变量 ,并向客户端返回 确认报文段 ,允许连接,无应用层数据。SYN=1,ACK=1,seq=y(随机),ack=x+1
第三次握手:客户端为该TCP连接 分配缓存和变量 ,并向服务器端返回确认的确认,可以携带数据。SYN=0,ACK=1,seq=x+1,ack=y+1
二、SYN洪泛攻击
SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的 第一个数据包 ,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
解决这个问题常用的方法是设置SYN cookie。这里就不细说了。
三、TCP的连接释放
不同于建立连接的三次握手,释放连接是四次挥手的过程。
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。
第一次挥手:客户端发送 连接释放报文段 ,停止发送数据,主动关闭TCP连接。FIN=1,seq=u(u表示之前已传送数据最后一个字节的序号再加一)。
第二次挥手:服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了—―半关闭状态。ACK=1,seq=v,ack=u+1。(v表示之前已接收数据最后一个字节的序号再加一)
第三次挥手:服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。FIN=1,ACK=1,seq=w,ack=u+1。二三步的ack是一样的,因为途中客户端没有发送数据。(w取决于第二步之后服务器所发送的数据量的多少)
第四次挥手:客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。如果客户端不发送这个报文段,直接关闭连接,那他自己是爽了,人家服务端没有收到确认还一直重读第三次挥手,这是一种不值得学习的渣男行为。
§5.3.3 TCP可靠传输
PS:这节不是重点,重点是下两节:流量控制和拥塞控制。
一、TCP可靠传输
1.概念:
网络层仅提供尽最大努力交付的可靠传输。因而传输层可以通过TCP协议实现可靠传输。如果使用的是UDP协议,那就只能指望于更上层的应用层提供可靠传输了。
所谓的可靠指的是:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
2.实现机制:
校验、序号、确认、重传。
校验 和UDP是一样的,添加伪首部。
序号 指的是一个报文段第一个字节的序号。
发送方发送完报文段后并不把报文段从缓存中移除。而是继续保存在缓存中,如果一段时间(这个时间叫做 重传时间 )没有收到 确认 ,就 重传 报文段,收到 确认 后,才将报文段从缓存中移除,并发送下一报文段。并且确认报文段会有确认号报文段。
二、确认重传机制
1.概念:
如果说发送方发送完123,发送456,再发送78,而456在途中数据丢失,接收方收到123返回确认号为4的确认,收到78后还是返回确认号为4的确认。等收到重传的456后,返回的确认的确认号就是9了。使用的是SR而非停等。
2.重传时间:
另外,对于 重传时间 ,由于不同的报文段走的路线不一样,所以重传时间也是不一样的。TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)。发了第一个后,第一个RTT就是RTTs,发了第二个后,前两个平均是RTTs,依次类推。
3.冗余ACK(冗余确认):
每当比期望序号大的失序报文段到达时,发送一个 冗余ACK ,指明下一个期待字节的序号。
假设发送方己发送1,2,3,4,5报文段
接收方收到1,返回给1的确认(确认号为2的第一个字节)
接收方收到3,仍返回给1的确认(确认号为2的第一个字节)
接收方收到4,仍返回给1的确认(确认号为2的第一个字节)
接收方收到5,仍返回给1的确认(确认号为2的第一个字节)
发送方收到 3个对于报文段1的冗余ACK ,于是便认为报文段2已丢失,重传报文段2号。这种技术称为快速重传。
§5.3.4 TCP流量控制
一、流量控制:
1.概念:
流量控制 就是 让发送方慢点 ,要让接收方来得及接收。避免严重的丢包现象。
2.滑动窗口机制:
TCP利用 滑动窗口 机制实现流量控制。
在通信过程中,接收方根据自己 接收缓存的大小 ,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的 窗口字段 来将rwnd通知给发送方),发送方的 发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
窗口字段还能设置为0,意思就是让对方暂时别bb
有这样一种情况,接收方给发送方的rwnd是0,过了一段时间又发送了rwnd为400B的报文,结果这个报文段丢失了。这造成的情况就是发送方窗口为0因而无法发送数据,而接收方却在等待发送方发送数据,双方都在等对方。
为了解决这一情况,TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。
若持续计时器设置的时间到期,就发送一个零 窗口探测报文段 。接收方收到探测报文段时给出现在的窗口字段值。
若窗口仍然是0,那么发送方就重新设置持续计时器。
§5.3.5 TCP拥塞控制
一、拥塞控制
1.拥塞:
当对资源需求的总和 > 可用资源时,就会出现拥塞。也就是说好多台主机都在发送信息,导致带宽被占用完。
网络中有许多资源呈现供应不足
网络性能变坏
网络吞吐量将随输入负荷增大而下降
所谓的拥塞控制,其实就是从全局性层面上防止过多的数据注入到网络中。
2.拥塞控制和流量控制的区别:
拥塞控制是全局性的,是网络蚌埠住了。
流量控制是点对点的,是接收方蚌埠住了。
二、拥塞控制的四种算法
这四种算法分别是 慢开始、拥塞避免 和 快重传、快恢复 。其中一二配合使用,三四配合使用。
为了讨论问题方便,我们还要预先提出几个假设:
① 数据单方向传送,而另一个方向只传送确认
② 接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程度。而实际上,发送窗口=Min{接收窗口rwnd,拥塞窗口cwnd}。 接收方 根据接受缓存设置的值,并告知给发送方,反映接收方容量。 发送方 根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。
三、慢开始和拥塞避免
cwnd默认的初始值是1,也就是从1开始。注意,1不是一字节,而是一个最大报文段长度MSS,其它数字也是。纵轴我们知道了,而对于横轴的传输轮次,一个 传输轮次 是指发送了一批报文段并收到它们的确认的时间。也就是一个往返时延RTT。而他也可以指开始发送一批拥塞窗口内的报文段到开始发送下一批拥塞窗口内的报文段的时间。
慢开始:从1开始,没经过一个传输轮次,拥塞窗口变成之前的二倍。ssthresh是慢开始门限,到了ssthresh的初始值时,速度就要就要稍微减一点了,从慢开始变成拥塞避免状态。
拥塞避免:每次只比上一次的拥塞窗口大小加一(不是一字节,而是一个MSS),等出现网络拥塞时,cwnd又变成了默认初始值1MSS,并把新的ssthresh设置成出现网络拥塞时的拥塞窗口大小除以二。然后重复以上步骤,如图所示。
四、快重传和快恢复
快重传在TCP可靠传输那里还提过一嘴。
这里快恢复也是除以二,发生快重传时的拥塞窗口大小除以二。
(PS:该笔记所对应的学习资料b站链接:2019 王道考研 计算机网络)
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。