1. 本章目录

![网络协议栈](https://uploadfiles.nowcoder.com/images/20200329/45741152_1585496563081_F5C65325FB2AB55AEB8BCF4477C0940C "图片标题")
按照计算机网络的协议栈,本章将会探索传输层(Transport)。会探索如下的知识点:

  • 理解传输层服务的基本理论和基本机制
     复用/分用
     可靠数据传输机制
     流量控制机制
     拥塞控制机制
  • 掌握Internet的传输层协议(第三周讲的是Internet的应用层协议Http)
     UDP:无连接传输服务
     TCP:面向连接的传输服务
     TCP拥塞控制

2. 传输层服务概述

2.1 传输层服务和协议

忽略掉中间的物理过程,比如网络层,链路层,物理层,不管有多远的物理距离,中间有多少个路由器转发,传输层协议可以认识是,为运行在不同主机(Host)上的进程之间提供了一种“端到端的逻辑通信机制”。

  • 也就是说,作为“发送方”:从应用层接受报文,并将其分成一个或者多个的报文段(Segment), 并向下传送给网络层。
  • “接收方”:从网络层获得报文,再将其一个或多个报文段组成一个消息,向上交给应用层。

其中Internet上的“TCP”和“UDP”是两种典型的传输层协议

2.2 传输层 vs. 网络层

网络层:提供“主机之间”的逻辑通信机制,基于IP协议
传输层:提供“不同的应用/进程”之间的逻辑通信机制,当然是不同主机上的
在这里可以用一个特别大的家庭,那种美国一家子20几口人的大家庭也类比:
家庭有12个孩子,其中李雷和韩梅梅是最大的哥哥和姐姐,其他的每个孩子都有信件需要接受发送;

  • 应用进程 = 10个孩子们
  • 应用消息 = 信封里面的信
  • 主机 = 房子
  • 传输层协议 = 李雷和韩梅梅(他们负责从门口收集信件后,再把信件送到每个弟弟妹妹的房间去)
  • 网络层协议 = 邮政系统

2.3 Internet传输层协议

  • 可靠、按序的交付服务(TCP) - “不会出错和丢失,按顺序发送接受”
     拥塞控制
     流量控制
     连接建立
  • 不可靠的交付服务(UDP)
     基于“尽力而为(Best-effort)”的网络层,没有做(可靠性方面的)扩展

两种服务均不保证:“延迟”和“带宽”

3. 多路复用和多路分用

本节图很多,请结合302的课件一起复习。

3.1 如何工作

例如图中,host1的p3进程给host2的p1进程发送报文,host3的p4进程给host2的p2发送消息,当他们同时到达host2时,从底部的物理层,链路层,网络层都是一条线上来,达到传输层后,协议保证相应的消息发送给相应的进程。- 接收段的多路分用
![图片说明](https://uploadfiles.nowcoder.com/images/20200330/45741152_1585500909947_0CB218DB187D252304D321E337712153 "图片标题")
总结来说:

  • 接收端进行多路分用:传输层依据头部信息将收到的 Segment交给正确的Socket, 即不同的进程
  • 发送端进行多路复用:从多个Socket接收数据,为每块数据封装上头部信息,生成Segment,交给网络层
  • socket就是:传输层和应用层之间的门

网络层是不关心端口号的,消息发送给目的主机,主机接收到“IP数据报(datagram)”。每个数据报携带源IP地址,目的IP地址(网络层传输),其中每个数据报中会携带一个传输层的“段(Segment)”,这个段包含源端口号和目的端口号。

主机收到Segment之后,传输层协议提 取IP地址和端口号信息,将Segment导向相应的Socket。下图展示TCP/UDP段格式
![TCP/UDP段格式](https://uploadfiles.nowcoder.com/images/20200330/45741152_1585500934832_0E7B862156BE86A0A519AE460B000389 "图片标题")

3.2 无连接分用

无连接多路分用是面向UDP的。UDP的的Socket用“二元组”标识(目的IP地址,目的端口号),当主机接受UDP段后(IP一致),首先检查段中的目的端口号,接着将UDP段导向绑定在该端口号的Socket。
比如:

DatagramSocket mySocket1 = new DatagramSocket(99111);// 99111是端口号
DatagramSocket mySocket2 = new DatagramSocket(99222);

不同源IP地址/源端口号的IP数据包被导向同一个Socket,不分青红皂白一股脑都接受,只要目的地是一样的(IP, Port),不管来源。下图可说明
![UDP复用](https://uploadfiles.nowcoder.com/images/20200330/45741152_1585502151982_A2AAAA5BF81F8762E18B2763C83DAB74 "图片标题")
P3的接受端,因为两个消息的“目的IP”和“目的port”都是一样的,同时把不同源IP和源端口的消息一同导向到一个Socket给p3。

3.3 面向连接的分用

服务器可以创建多个进程,同时支持多个TCP Socket,每个Socket都有自己的四元组标识。
TCP的Socket用四元组标识:[源IP地址] [源端口号] [目的IP地址] [目的端口号],接受端利用这四个值将Segment导向合适的Socket。
从上图可以看出,TCP是一对一的关系,一个服务器进程对应一个客户机进程。TCP相比UDP区分了,不同源IP和不同源Port的报文,在消息目的准确的前提下(目的IP,目的Port),区分出不同源IP&同Port(不同主机的同进程),同IP&不同Port(同主机的不同进程),当然还有不同主机的不同进程三种情况。
![TCP分用](https://uploadfiles.nowcoder.com/images/20200330/45741152_1585503071740_D9B75E3BD72EF974CF118BEE23DD883E "图片标题")

3.4 多线程web服务器

多个TCP进程是很消耗资源的事情,利用多线程这种轻量级的技术代替多进程,也可以实现分用。
![多线程分用](https://uploadfiles.nowcoder.com/images/20200330/45741152_1585503190014_1291BD470CFABD3C345E4168EC32520C "图片标题")