运输层

  1. IP层提供的是主机间的逻辑通信,运输层提供的是进程间的逻辑通信
  2. TCP/IP协议运输层有两个协议:UDP和TCP
  3. UDP:UDP是面向无连接的、全双工、尽最大努力交互、支持一对多和多对一的通信方式。有时用UDP会更加有效,比如实时性要求很高时。UDP仅在数据报加上不多的内容:端口和差错校验,所以UDP首部仅占8字节。发送方应用程序给UDP多长的报文,UDP就在这个长度的基础上加上首部发送,UDP既不会合并也不会拆分,所以应用程序必须选择合适UDP报文的长度,UDP报文格式如下图所示,这里的伪首部是IP层的数据,图上之所画出是因为计算校验和时要用到伪首部。
  1. 传输层主要是给进程间通信提供服务,而在因特网上的计算机的操作系统是多种多样的(linux、window、unix),每种操作系统的对进程的表示符是不一样的,但是如果想做到网络中的各进程可以通信,就要求进程间标识符应该是一致的才行,所以TCP或UDP就应该使用同一标示方式使得所有计算机中的进程标识符一致。
  2. 在传输层中我们通过IP查找到对应的主机,然后通过端口找到对应的进程,因为使用了端口后可以很方便的解决以下问题:接收方更换了接收报文的进程但是此时无需通知发送方;进程都是动态的所以发送方几乎无法识别接收方的进程。这个端口也就是上述的统一的标示符。端口有16位,代表本地的端口。
  3. 熟知端口取值范围:0 - 1023。         登记端口:1024 - 49151,为防止重复必须使用IANA登记。            短暂端口:49152 - 65535,留给用户使用,使用结束后这个端口供其他用户重复使用
  4. TCP:面向连接、全双工、保证可靠交互、支持一对一通信、面向字节流。TCP是发送数据报会有拆分和合并的,它是依据接收方给出的窗口值和网络拥塞情况来选择拆分或合并的。
  5. TCP连接端点叫做套接字,是有IP加上端口号构成:套接字sockt = (IP:端口号)
  6. TCP能实现可靠通信是因为自动重传请求协议(ARQ):TCP接收方接收到了正确数据会回复发送方一个”确定“,发送方收到”确定“才会继续发送,如果长时间没收到”确定“就会因为超时重发。发送分组和确定分组都会进行编号(每字节为一个分组),如果发送方收到了一个由于网络延迟而迟到的“确定”会直接忽略它。
  7. 自动重传请求中TCP发一个分组(字节)后就等待着一个确定,在这段时间什么也不做,信道利用率是不是有点低?所以我们便发明了一种新传输方式:连续自动重传请求协。
  8. 连续自动重传请求协:每个满足TCP协议的计算机的运输层都有两个窗口,发送窗口和接受窗口,窗口有一定大小且以字节为单位。发送方不是发一个字节后非要等着接收方回复的“确定”才能发下一字节,而是只要字节的发送窗口还有”空位“就可以连续不断发送数据,如何判断是否有”空位“在下文中介绍。

                    

  1. TCP报文段 = TCP首部 + TCP数据段
  2. 后面再详细介绍重传流程,先了解下TCP报文的首部组成:

                    

          源、目的端点:各占两个字节,运输层和应用层的服务接口。

          序号:每个字节都有自己的顺序号,TCP首部这个序号是指发送方发出该报文第一个字节的序号。

          确定号:接收方会对按序到达的最后一个字节给出”确定“,以表示前面的数据已经正确接收,这里的确定号的值就是最后一个字节序号加一。说白了就是表明说明自己接收到了哪些,还想从哪里开始接收。

          数据偏移:说明TCP报文数据段距离TCP报文的首部起始位置有多远,其单位是 4byte。

          URG: 紧急指针有效位,为1时表示有效。

          ACK: 确定号有效位,为1时表示有效。

          PSH: 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

          RST: 该值为1表示tcp连接中出现严重错误,应立刻释放连接,然后重新建立连接。

          SYN:该值为1表示这是一个连接请求或连接接受报文。

          FIN:该值为1表示发送端数据发送完毕请求释放连接。

          窗口:表示自己窗口信息,为对方设置窗口大小提供依据。

          校验和:前边已介绍。

          紧急指针:指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。

          选项:由好几种选项组成,有MSS选项、窗口扩大选项、时间戳选项、选择确定选项,这有用户自己制定,不是标准规定。

          填充:为使TCP首部为4的整数倍。

  1. 下图说明发送方和接收方窗口的关系,也说明了发送方怎么判断接收方是否有”空位“。

          

          这里有一点要仔细:接收方发送”确定“是按序发送的,假如说接收方此时已经收到了前1~4序号的字节,想收到序号为5的字节,但是此时却收到了序号为7的字节,那么此时发送方是不会发送确定号的。

          发送方接收到”确定“后窗口就向前(右)移动。若果发送方未收到的”确定“字节太多将发送方的发送窗口占满,那么发送方将不再发送数据

  1. 如下图,发送方和接收方分别有自己的送和接收缓冲区:

          

          发送缓存的内容:准备要发送的数据、将以发送了但是未收到”确定“的数据保存。

          接收缓存的内容:按序到达但是未被应用程序读取的数据、未按序到达的数据(TCP未规定未按序到达的数据怎么处理,通常是存在接收缓存,等缺少的序号到达后一起交给应用层)。

 

  1. 超时重传:发送方发出的报文段在一定时间内未收到接收方返回的”确定“,就重新传输该报文段。超时时间的算法不多说明。
  2. 介绍一下TCP首部选项字段中的选择确定(sack):如果接收方接收到多组连续数据但都不是按序的,而接受方有不想让发送方重传导致浪费资源,所以需要在选项字段中添加选择确定(sack),则需要在TCP报文首部添加”选择确定允许字段“,且用户双方需要协商达成一致。由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息,我们通常是不需要这个字段的。
  3. 有个bug在TCP中是需要避免的:当接收方发来一个窗口值为0的消息后,发送方是应该停止发送数据的,但是这个表示窗口值为0的消息丢失了怎么办?发送方会一直不断发送,浪费网络资源。       解决方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值