计算机网络-运输层

Posted by chinaljr on April 10, 2018

概述

运输层位于应用层和网络层之间。关注TCP和UDP。 运输层为运行在不同主机的应用进程之间提供了逻辑通信,应用进程使用运输层提供的逻辑通信功能彼此发送报文。 运输层将报文转化为segment报文段,拆分然后加上首部。

运输层:进程间逻辑通信。网络层(网络边缘):主机间逻辑通信 运输层只工作在端系统中。应用层需要制定选择运输层。

IP:best-effort delivery service 不确保交付,不保证按序交付,不保证完整性。 UDP和TCP是将在两个端系统间的IP的交付扩展到进程间的交付,被称为多路复用 多路分解 UDP:数据交付,差错检查。TCP:可靠数据传输,流量控制,序号,确认,定时器,拥塞控制

多路复用与多路分解

套接字(socket),进程与网络通信的接口。 套接字有唯一标识,每个报文段有特殊的字段来指示该报文要交付的套接字。 16位source port number field 和 16 位 destination port number field UDP套接字:只有源端口和目的端口号,源不同,目的相同,那么套接字相同。 TCP套接字,不是报文段:有源IP,源端口,目的IP,目的端口。源不同,目的相同,但套接字不同,除非初始链接请求。

nmap端口扫描

UDP

干了很少的事情,无连接的。

UDP优势:

  • Finer application-level control over what data is sent and when. 实时应用更关心这个。超过UDP功能的东西,应用自己搞
  • NO connection establish
  • NO connection state TCP维护那么多东西肯定要付出代价的啊
  • small packet header overhead UDP 8bytes TCP 20bytes

UDP很多重要应用,RIP路由选择表更新,网络管理数据(SNMP),DNS服务 biaoge

UDP没有拥塞控制,引发高丢包率。

报文结构:

源端口号,目的端口号,长度(以字节为单位),检验和

UDP checksum

求和,循环进位,变反码。 接收方如果没有错误,所有数字加起来为1111111111111111。这样做的原因,我们不知道途中是否所有的都进行了差错检验,内存的比特差错。

端到端原则

Principles of reliable Data transfer

数据不会损坏或者丢失,并且按照顺序交付的。

这部分内容先默认,分组按照顺序发送,有些可能丢失,并且不会重新排序

  • rdt_send()函数
  • rdt_rcv()
  • deliver_data
  • udt_send()
  • packet = make_pkt(data)
  • extract(packet,data)
  • deliver_data(data)
  • sndpkt/rcvpkt
  • isNAK/isACK
  • corrupt()
  • has_seq0/has_seq1
  • stop_time/start_time/timeout

Reliable Data Transfer over a Perfectly Reliable Channel rdt1.0

Reliable Data Transfer over a Channel with Bit Errors rdt2.0

自动重传请求ARQ 增添的功能:差错检测,接受方反馈,重传。

停等协议

rdt2.0致命缺陷:没有考虑ACK和NAK分组受损的可能性。

处理ack和nak受损三种可能性: * * 没收到就问,没“听”清,死循环 * 增加检验和比特,能够恢复差错。无法处理丢失 * 含糊不清的就重传。导致产生冗余分组,并且我不知道这是新的还是重传。

解决方案:sequence numberrdt2.1

对于停等协议,一位就够了。

rdt2.2

在有比特差错信道上的协议,与rdt2.1对比。ack多了一位表示id,nak变成了ack。

rdt3.0

* * countdown timer * 发送时启动 * 响应中断 * 终止定时器

比特交替协议,alternating-bit protocol

流水线可靠数据传输协议

停等协议利用率太低。网络协议限制网络硬件。

pipelining

* * 增加序号范围 * 能够缓存 * 丢失,损坏,延时过大,GBN SR

回退N步

  • 基序号base:最早未确认的分组序号
  • 下一序号nextseqnum:下一个待发送
  • N:window size 为了流量控制
  • GBN == sliding-window protocol

  • GBN发送方
    • 上层调用,窗口是否已满,拒绝/缓存
    • 收到ACK,累积确认(因为接收方按序接收,所以ACK是有序的)。
    • 超时事件
  • GBN接收方
    • 是expectedseqnum,发ACK
    • 不是,就丢弃,发送最近的ack

接收方缓存简单,不用缓存失序分组,但是之后需要更多的重传。

SR

新变量rcv_bace

  • 发送方
    • 从上层接收数据
    • 超时,每个分组一个定时器!
    • 收到ACK,标记已接收,如果是base,那么向前移动,发送新的窗口内分组。
  • 接收方
    • 窗口内的分组被接受,缓存,发ACK,等于rec_bace交付连续一部分,向后移动。
    • 窗口之前的一个窗口大小被接受,返回ACK
      • 可能问题是:之前的ACK丢失
      • 考虑极限情况,分组全部收到,snd_base的ACK丢失的情况下,接收窗口最多领先发送窗口一个身位。
      • 窗口重合会导致严重后果,因为一个序号表示不同的分组。因此序号范围要大于2W
    • 其他情况丢弃

connection-oriented transport TCP

  • TCP/IP 协议,Cerf && Kahn 2004图灵奖
  • full-duplex service
  • point to point
  • 三次握手 three way handshake
  • Maximum Segment Size,MSS 最大报文长度
  • Maximum Transmission Unit,MTU 最大传输单元
  • 以太网和PPP链路协议具有1500字节的MTU
  • TCP segment

TCP报文结构

  • 比UDP多的字段
    • 32 sequence number field && 32 acknowledge number field
    • 16 receive window field 流量控制
    • 4 header length field 首部长度字段,单位32bit
    • 可选字段 options field 调节MSS 调节 窗口大小,时间戳
    • 6 flag field**ACK接受,RST连接,SYN建立,FIN拆除,PSH交给上层,URG晋级数据

序号和确认号

  • 序号是首字节字节流的编号,不是报文段的编号。
  • TCP是双方的,A写进去的填充号是主机A期望从主机B收到的下一字节的序号。
  • cumulative acknowledge。
  • 失序到达
    • 丢弃
    • 保留

telnet例子

远程登录

  • A发起,A是客户,B被标为服务器
  • echo back
  • 确认 被 捎带piggtbacked