TCP/IP相关拾遗

17-22章 TCP内部细节
IP是网络层上的主要协议,同时被TCP和UDP使用,TCP和UDP的魅族数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。

ping程序是对两个TCP/IP系统连通性性能测试的基本工具。它只利用ICMP回显请求和回显应答报文,而不用经过传输层(TCP/UDP)。ping服务器一般在内核中实现ICMP的功能。

IP路由操作对于运行TCP/IP的系统来说是基本的,不管是主机还是路由器。路由表项的内容很简单,包括:5bit标志、目的IP地址(主机、网络或默认)、下一站路由器的IP地址(间接路由)或本地接口的IP地址(直接路由)以及指向本地接口的指针。

UDP:用户数据报协议

udp是一个简单的面向数据报的传输层协议:进程的每个输出操作都正好产生一个udp数据,并组装厂一份待发送的ip数据报。
udp不提供可靠性:它吧应用程序传个IP的数据发送出去,但是并不保证它们能够到达目的地。

UDP首部

UDP首部的各个字段
端口表示发送进程和接收进程。UDP长度指的是UDP首部和UDP数据的字节长度。该字段最小值为8字节。在这里插入图片描述

UDP检验和

UDP检验和覆盖UDP首部和UDP数据。IP首部的检验和,它只覆盖IP的首部——并不覆盖IP数据报中的任何数据。
UDP检验和是可选的,TCP的检验和是必须的。
UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间的任何改动。

IP分片

任何时候IP层即受到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据,并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对传输层透明。当IP数据报被分片后,每一片都是一个分组,具有自己的IP首部,并在选中路由时与其他分组独立。这样,当数据报的这些分片到达目的端时有可能会失序,但是IP首部中有足够的信息让接受端能挣钱组装这些数据报片。

使用UDP很容易导致IP 分片。TCP视图避免分片,但对于应用程序来说几乎不可能强迫TCP发送一个需要进行分片的长报文。

ICMP不可达差错(需要分片)

当路由收到一份需要分片的数据报,而在IP首部又设置了不分配(DF)标志比特。如果某个程序需要判断到达目的端的路途中最小MTU是多少——乘坐路径MTU发现机制,那么这个差错就可以被该程序使用。

广播和多播

广播和多播仅应用于UDP,它们对需要报文同时传往多个接收者的应用来说十分重要。
每个以太网帧包含源主机和目的主机的以太网地址,通常每个以太网帧仅发往单个目的主机,目的地址指明单个接受接口,因而成为单播
有时一个主机要向网上的所有其他主机发送帧,这就是广播
多播处于单播和广播之间:帧仅传送给属于多播组的多个主机。

TCP:传输控制协议

TCP的服务

TCP和UDP都使用相同的网络层(IP)。TCP提供一种面向连接的、可靠的字节流服务。
TCP通过以下方式提供可靠性
1.应用数据被分割成TCP认为最合适发送的数据块
2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文。如果不能及时收到一个确认,将重发这个报文段。
3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认,这个确认不是立即发送,通常推迟几分之一秒
4.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检查数据在传输过程中的任何变化。
5.TCP基于IP数据报来传输,IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序,如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层
6.既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据
7.TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。浙江纺织较快主机致使较慢主机的缓冲区溢出。

TCP的首部

在这里插入图片描述
每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。
TCP为应用层提供全双工服务。这意味着数据能在两个方向上独立地进行传输。因此,连接的每端必须保持每个方向上的传输数据序号。
TCP可以表述为一个没有选择确认或否认的滑动窗口协议
TCP的流量控制由连接的每一段通过声明的窗口大小来提供。窗口大小为字节数,其实与确认序号字段指明的值,这个值是接收端正期望接受的字节。
检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
最常见的可选字段是最长报文大小(MSS)

小结

TCP提供了一种可靠的面向连接的字节流运输车服务。
TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对时序的数据重新排序,定期重复数据;TCP提供端到端的流量控制,并计算和检验一个强制性的端到端检验和。
许多流行的应用程序如Telnet、FTP和SMTP都是用TCP。

TCP连接的建立和终止

建立连接协议

1)请求端发送一个syn端指明客户打算连接的服务器的端口,以及初始序号,这个syn端为报文段1.
2)服务器返回包含服务器的初始序号的syn报文段作为应答。同时,将确认序号设置为客户的ISN加1以对客户的syn报文段进行确认。
3)客户必须将确认序号设置为服务器的ISN加1以服务器的SYN报文段进行确认。

发送第一个syn的端将执行主动打开,接受这个syn并返回下一个syn的另一端执行被动打开。

连接终止协议

终止一个连接要经过4次握手。这是由TCP的半关闭造成的。既然TCP连接是全双工,因此每个方向必须单独地进行关闭。
首先进行关闭的一方将执行主动关闭,而另一方将执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭。

2MSL等待状态

IP数据报TTL的限制是基于跳数,而不是定时器,对于一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,改连接必须在TIME_WAIT状态停留的时间为2被的MSL。这样可让TCP再次发送最后的ACK以防这个ACK丢失。

平静时间的概念

如果使用处于2MSL等待端口的主机出现故障,它汇总MSL内重新启动,并立即使用故障前仍处于2MSL的插口对来建立一个新的连接吗?如果是这样,在故障前从这个连接触发而迟到的报文段会被错误地当做重启后新连接的报文段。无论如何选择重启动后新连接的初始序号都会发生这种情况。
为了防止这种情况,TCP在重启动后的MSL秒内不能建立任何连接。这就称为平静时间。

FIN_WAIT_2状态

在FIN_WAIT_2状态我们已经发出来FIN,并且另一端也已对它进行确认。除非我们实行半关闭,否则将等待另一端的应用层意识到它已收到一个文件结束符说明,并向我们发一个FIN来关闭另一方向的连接。只有当另一端的进程完成这个关闭,我们这端才会从fin_wait_2状态进入time_wait状态。

如果执行主动关闭的应用层将进行全关闭,而不是半关闭来说明它还想接收数据,就设置一个定时器。如果这个连接空闲10分钟75秒,TCP将进入CLOSED状态。

复位报文段

无论何时一个报文段发往基准的连接出现错误,TCP都会发出一个复位报文段。基准的连接:目的IP+端口以及源IP+端口的连接

到不存在的端口的连接请求

目的端口没有监听,它将产生ICMP端口不可达的信息,而TCP则使用复位

异常终止一个连接

正常情况下,终止一个连接是一方发送FIN。但也有可能发送一个复位报文段来中途释放一个连接。有时称为异常释放。

异常终止一个连接对应用程序来说有两个优点:(1)丢弃任何待发数据并立即发送复位报文段;(2)RST的接收方会区分另一端执行的是异常关闭还是正常关闭。

检测半打开连接

半打开:如果一方已经关闭或异常终止连接而另一方却还不知道。
半打开连接的另一个常见原因是当客户主机突然掉电而不是正常的结束客户应用程序后再关机。对于这种情况,TCP的处理原则是接收方以复位作为应答。

交互数据总是以小于最大报文段长度的分组发送。对于这些小的报文段,接收方使用经受时延的确认方法来判断确认是否可被推迟发送,一遍与会送数据一起发送。

在较慢的广域网环境中,通常使用Nagle算法来减少这些小报文段的数目。这个算法限制发送者任何时候只能有一个发送的小报文段未被确认。

慢启动

慢启动算法是在一个连接上发起数据流的方法。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口,即为cwnd。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段。每收到一个ACK,拥塞窗口就增加一个报文段,发送方取拥塞窗口与通过窗口中的最小值为发送上限。

拥塞避免算法

拥塞避免算法是一种处理分组丢失的方法。有两种分组丢失的指示:发生超时和接受到重复的确认。拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们可以降低分组进入网络的传输速率,于是可以调用慢启动来做到这一点。
拥塞避免算法和慢启动算法需要对每个链接维持两个变量:拥塞窗口cwnd和慢启动门限ssthresh
拥塞避免算法的工作过程:
1.对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。
2.TCP输出例程的输出不超过cwnd和接收方通过窗口的大小。拥塞避免是发送方使用的流量控制,而通过窗口则是接收方进行的流量控制。
3.当拥塞发生时,ssthresh被设置为当前窗口大小的一半
4.当新的数据被对方确认时,就增加cwnd,但是增加的方法依赖于我们是否正在进行慢启动或拥塞避免。如果cwnd<=ssthresh,则正在进行慢启动,否则正在进行拥塞避免。

快重传与快恢复

如果一连串收到3个或3个以上的重复ACK,就非常可能是一个保温丢了。于是我们就重传丢失的数据报文段,而无需等待超时定时器移除。这就是快重传算法。接下来执行的不是慢启动算法,而是拥塞避免算法。这就是快恢复算法。
算法执行过程:
1.当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置swnd为ssthresh加上3倍的报文段大小。
2.每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送1个分组(如果新的cwnd允许发送)
3.当下一个确认新数据的ACK到达时,设置swnd为ssthresh。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第一个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值