
Q1:运输层和网络层的关系
举个例子来说明两者关系:
有两个家庭,一家位于广州,一家位于北京,每家有 3个孩子。这两个家庭的孩子们喜欢彼此通信,每封信都用单独的信封通过传统的邮政服务发送。每个家庭有一个孩子负责收发邮件,北京家庭是 阿京,而广州家庭是 阿州。每周阿京去她所有的兄弟姐妹那里收集邮件,并将这些邮件交到邮递员处上。当信件到达北京家庭时,阿京也负责将信件发到她的兄弟姐妹手上,广州家庭中 阿州也负责类似工作
通过运输层协议,两台电脑仿佛直接相连一样。应用无需知道底层内部实现的原理和细节,比如怎么把远隔世界两地电脑上的数据进行相互传输
Q2:注意点
TCP和 UDPIP,其提供的是一种不可靠的数据传输服务host) 上的应用或者说进程提供逻辑通信这一目的,运输层协议必须能分辨出数据的来源和去向。为此,运输层存在着两种行为,多路复用和多路分解用上面的两个家庭的例子进行形象化地阐述就是:多路复用就是阿州和阿京将兄弟姐妹的信一起交给邮递员
Q1:如何使用运输层的协议?
操作系统提供了被称为 socket 的接口 api 供编程人员调用,对 socket 的形象理解是其是一种抽象,将复杂的实现 (tcp/udp) 协议的各种行为抽形成简单的几个函数给开发人员使用。就像浏览器将发送请求报文这一 http 协议规定的行为,抽象成我们只需要输入 url 然后回车即可
这里需要注意的一点是:
Socket,多个 TCP Socket 可以监听同一个端口,并保证接受的数据依旧是正确的UDP Socket 就无法监听同一端口,这其中的差异源于 TCP 和 UDP 协议的不同TCP 是面向连接的,其有足够状态的信息来分辨数据来源,后定向到正确的 socketUDP 不需要维持连接,仅仅通过端口号来决定数据的去向,所以会导致冲突UDP 和TCP的多路复用和分解Q1:UDP的多路复用和分解
一个 UDP Socket 通过一个二元组 (目的 IP 地址,目的端口号) 来标识,当输入层收到数据时,通过检查这个二元组,来定向数据该去往哪一个 UDP Socket。这也是多个 UDP Socket 无法监听同一个端口的原因
Q2:TCP 的多路复用分解
一个 TCP Socket 通过一个四元组 (源 IP,源端口,目的 IP,目的端口号) 来标识,这也解释为什么多个 TCP Socket 可以监听同一个端口,尽管目的 IP和目的端口号是一样的,但是源 IP和源端口的组合总是不同的

UDPUDP基本概念相比于 TCP来讲,UDP是一个简单的协议,就是把网络层 IP 提供的服务封装了下,实现了多路复用和分解,提供了端到端进程间的通信和错误检验服务
相对于 TCP 来说:
缺点:
UDP 是不可靠的传输服务优点:
UDP报文端结构:

Q1:数据传输可能遇到的问题:
Q2:解决方法:
Q3:如何在保证可靠性的前提下,提高其性能?
pipelining) 技术引入流水线导致了:
Q4:如何处理分组丢失、损坏的问题
A.回退 N 步
ACK
2.单一定时器B.选择重传
ACK
2.多个定时器TCPTCP基本概念A.特点:
TCP 头部TCP 连接的每一端都具有发送缓存和接受缓存B.报文段结构

部分参数解释:
seq) :所带数据的第一个比特的序号,同时也是接收方期待的序号,等于接收方回复报文中的 ACK(n) 中的 nack) :对于一个 ACK(n) 来说,告诉对方 n-1 前的数据已经收到,下一次期待的序列号为 nACK :指示,用于指示报文中确认号字段的值是有效的PSH :指示,立即发送_发送缓存_里的数据RST :指示,用于强制关闭连接SYN :指示,用于握手阶段也就是建立连接的阶段FIN :指示,用于正常关闭连接TCP 的流量控制功能TCP 协议为数据的每一 Byte 都编号,而非针对报文段Byte 的计时器ACK(回退N步的特性)ACK(其实是收到四个同样的ACK,第一个是正常的,后三个才是冗余的),会触发快速重传,立即重发分组ACK呢?ACK作为判定丢失的准则其本身就是估计值。TCP报文中通过 接受窗口 指示发收者还能发送多少数据接受窗口 (rwnd) 公式:
rwnd = RcvBuffer - [LastByteRead - LastbyteRead]LastByteSent - LastByteAcked <= rwndTCP 连接管理Q1:建立连接(三次握手)

SYN 位置 1 的报文段SYN 为 1,ACK 为 1 的报文段ACK 为 1,且附带数据的报文段形象化地理解:
TCP 三次握手就好比两个人在街上隔着50米看见了对方,但是因为雾霾等原因不能100%确认,所以要通过招手的方式相互确定对方是否认识自己。 张三首先向李四招手(syn),李四看到张三向自己招手后,向对方点了点头挤出了一个微笑(ack)。张三看到李四微笑后确认了李四成功辨认出了自己(进入estalished状态) 但是李四还有点狐疑,向四周看了一看,有没有可能张三是在看别人呢,他也需要确认一下。所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入established状态)。 于是两人加快步伐,走到了一起,相互拥抱

Q2:断开连接(四次挥手)

FIN 为 1 的报文段ACK 为 1 的报文段FIN 为 1 的报文段ACK 为 1 的报文段形象化地理解: 张三挥手(
fin)——李四伤感地微笑(ack)——李四挥手(fin)——张三伤感地微笑

Q1:拥塞的代价
Q2:TCP 的拥塞控制
TCP 采用端到端的拥塞控制TCP 的发送方如何限制自己的发送流量的速率?通过设置一个拥塞窗口 (cwnd), 并且保证:LastByteSent - LastByteAcked <= min{cwnd, rwnd}
timeoutACK 后连续收到三次冗余 ACKcwnd 的值从 1 MSS 开始,并且对每一个 ACK,cwnd 值变为原来的 2 倍,直到超过阈值 (ssthresh),转为拥塞避免模式
在每一个 RRT 时间,cwnd 的值增加一个 MSS
cwnd 的值降为一半加上重复收到的重复 ACK 的数量,并且每一个 ACK,cwnd 的值增加一个 MSS
在实践中,一旦 timeout 就会会到慢启动的状态,多次重复 ACK 则会进入快速恢复状态
Q3:TCP 公平
TCP 的公平性在于保证每个连接的吞吐量是平均的,而不是应用或进程间
弄清这个问题,我们需要先弄明白三次握手的目的是什么,能不能只用两次握手来达到同样的目的。
因此,需要三次握手才能双方确认双方的接收与发送能力是否正常

试想如果是用两次握手,可能会出现下面这种情况:
如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一直等待客户端发送数据,浪费资源

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,所以服务端可以立即close,也可以发送一些数据给客户端后,再发送FIN报文给客户端来表示同意现在关闭连接,因此,服务端ACK和FIN一般都会分开发送。
如果文章对您有一点帮助的话,希望您能点一下赞,您的点赞,是我前进的动力
本文参考链接: