OSI模型中最下面的两层用来解决两个硬件设备在物理上的通信问题(如规定怎么将电平信号转换为数字信号),相对应的TCP/IP模型中,这部分代表将会将机器封装为一个MAC地址来实现通讯。网络层是关于,具体到应该由谁、哪一个设备来接受传输的信号,所以对应的TCP/IP模型中,用IP地址来表示“接收方”的地址,用于建立连接。
对应到怎么实现的问题,看上图,可以看到每一层对应的包里面的头部信息,即发送的时候,从应用层到数据链路层一层层下来进行“包装”,加上用于对应层的标识部分,在接收方则是从数据链路层一层层上去到具体应用,一层层对应地进行拆包装,最终送达。可以当成邮递快递那样理解,在快递发送的时候,最先看的是哪个省份、哪个市区,把送到某个地区的快递统一装在卡车上送到一个集中的地点,然后一步步分发,最后在目标地点附近的派送中心看快递具体到哪个位置、房号,最后才送到用户手里。如果好奇具体内容是怎么样的可以用wireshark来抓包看一下,这里就不展开来说了。
运输层的两个主要协议
- 用户数据报协议UDP(User Datagram Protocol)
- 传输控制协议TCP(Transmission Control Protocol)
UDP在传输数据前不需要建立连接,远地主机的运输层在接收到UDP报文之后不需要给出任何确认,所以UDP提供的是一种不可靠的连接,不过通常效率更加高(所以如果是更加讲究传输速率而不是保证数据的正确的话,更常用UDP,如视频通话,图像扭曲或部分图像丢失是可以接受的,所以通常用UDP实现)。
TCP提供面向连接的服务,传输数据前必须要先建立连接,数据传送结束后要释放连接。TCP提供可靠的、面向连接(即在传输数据前一定要建立连接)的运输服务,所以不可避免地增加了许多开销,因此代价较大。
关于端口
这里的端口指的是使用在运输层的协议端口号(protocol port number)。这种在协议栈层间的抽象的协议端口是软件端口,而不是类似于路由器或者交换机上面的硬件端口。硬件端口用于不同硬件设备的交互,软件端口是用于应用层的各种协议进程与运输实体进行层间交互的一种地址。UDP和TCP的首部格式中都有源端口和目的端口两个字段。运输层收到IP曾交上来的运输层报文的时候根据首部中目的端口号来交付数据给应用层的目的应用进程。
TCP/IP的运输层用一个16位端口号来标志一个端口,端口号只具有本地意义,用来标志本计算机应用层中的各个进程在和运输层交互时的层间端口,如果是在不同计算机中,那么相同端口号其实没有关联。16位端口号允许65535个不同的端口号。
计算机通信的时候需要知道对方的IP地址和端口号,IP地址用于找到目标计算机,端口用于找到目标应用进程。
互联网上计算机通信方式是客户-服务器方式,所以端口号分为两大类:
- 服务器端使用的端口号:这里又有分两类,一类是熟知端口号(well-known port number)或系统端口号,01023,分配给了TCP/IP中最重要的一些应用程序;另一类是等级端口号,102449151,使用这类端口号的时候需要在IANA按照规定的手续登记以防重复;
- 客户端使用的端口号,49152~65535,尽在客户进程运行时才动态选择,因此又名短暂端口号。这类端口号可以在当前客户进程结束之后分配给另一个客户进程使用
UDP
主要特点:
- 无连接:发送数据前不需要建立连接,因此减少了开销和发送数据前的时延
- 尽最大努力交付:不保证可靠交付
- 面向报文:UDP对应用层交下来的报文,直接保留这些报文的边界然后进行发送,即收到多长的报文就直接照样发送
- 没有拥塞控制:所以源主机可以按照恒定速率来发送数据,因为不会受到网络情况的影响
- 支持一对一、一对多、多对一、多对多的交互通信
- 首部开销小:首部只有8个字节,TCP有20个
首部格式
用户数据报UDP有两个字段:数据字段和首部字段。首部字段有8个字节,4个字段,每个字段长2个字节,4个字段意义如下:
目标计算机接收到UDP数据报时会根据首部中的目的端口把UDP数据报通过对应的端口交给应用进程,但是,如果该端口不存在,那么会直接丢弃掉这个报文并用网际控制报文协议ICMP来发送“端口不可达”差错报文给发送方(traceroute就是基于这个机制来运作的)。
UDP使用到端口号,但是因为不需要事先建立连接,所以不需要套接字socket(TCP才必须要在socket之间建立连接)。
校验和
在计算校验和之前要在UDP用户数据报前面添加12个字节的伪首部,这是只在计算校验和的时候才临时加的,不下传或者上交,只是用于计算校验和。
直接截图自书上了,没什么好说的。
参考
《计算机网络》 谢希仁著:不用说了,经典教材。