传输层位于网络层之上,主要功能是为运行在不同主机上的进程之间提供逻辑通信,同时传输层向它上面的应用层提供通信服务。不管是考试还是面试,传输层历来都是整个计算机网络中核心中的核心,所以对于传输层的学习大家一定要上心。同时传输层还会涉及套接字(socket)编程(网络编程),所以大家可以结合下面的专栏进行学习

如下,两台主机使用网络核心部分的功能进行端到端通信,只有主机的协议栈才有传输层和应用层,而像路由器等只会用到下三层

①:提供进程与进程之间的逻辑通信(即端到端):与网络层的区别是,网络层提供的是主机之间的逻辑通信
②:复用和分用:
③:差错检测:
④:传输层两大协议
面向连接的传输控制协议TCP:传送数据之前必须建立连接,数据传送结束后要释放连接。不提供广播或多播服务。由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销,例如确认、流量控制、计时器及连接管理等;特点是可靠,面向连接,时延大,适用于大文件
无连接的用户数据报协议UDP :传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认;特点是不可靠,无连接,时延小,适用于小文件
端口:够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。端口是传输层服务访问点(TSAP),其在传输层的作用类似于IP地址在网络层的作用或MAC地址在数据链路层的作用,区别在于IP地址和MAC地址标识的是主机,而端口标识的是主机中的应用进程
端口号:应用进程通过端口号进行标识,端口号长度为16bit,能够表示65536(216)个不同的端口号。端口号只具有本地意义,即端口号只标识本计算机应用层中的各进程,在因特网中不同计算机的相同端口号是没有联系的。根据端口号范围可将端口分为两类:

套接字英文愿意为插座,孔的意思,但是这里却把它翻译为“套接字”,是在让人不太理解。
在Linux系统编程中我们知道,如果想要把内容打印到屏幕上,或者写入到硬盘中,就必然要借助系统调用接口,或者称其为“陷入内核”

那么现在到了网络了,我们要借助网络实现不同主机的进程相互通信,根据TCP/IP分层模型,可以看到我们绝大部分能做的操作都在应用层,传输层开始以下均属于操作系统。

当网卡收到数据后,不断向上分用,最后通过应用层拿到自己的数据,其中传输层属于操作系统,这也就意味着想要处理数据就必须要明白TCP/IP的协议操作和相关复杂的系统调用接口,这很显然使很繁琐的。
同时前文说过,IP地址+端口号可以标识全网唯一的一个进程,所在在标识好进程后,我们熟知的socket就是把TCP/IP层复杂的操作抽象为了几个简单的接口以供应用层调用,以此来实现进程通信。

因此socket是介于应用层和传输层之间的一个抽象层,或者称他为一种通信机制。套接字以上的进程是受应用程序控制的,其以下的传输层协议则是受操作系统控制。因此,只要应用程序使用TCP/IP协议进行通信,它就必须要通过套接字与操作系统进行交互。所以对于开发者来说,他只需要关心这层抽象层,不需要关系传输层复杂的操作,当然它所能操作的权限或者范围就没有TCP/IP直接操作的范围大了。如socket不可以选择某些传输层的参数(比如最大缓存空间和最大报文长度等等)

所以服务器就像一个大插排,包含很多插座,客户端就是像一个插头,每一个进程代表一条电线,客户端将电线的插头插到服务器插排上对应的插座上,就可以开始通信了。

套接字是应用程序为了获得网络通信服务而与操作系统进行交互时使用的一种机制: 当应用程序需要使用网络进行通信时,必须首先发出socket系统调用,请求操作系统为其创建一个套接字。此调用的实际效果是请求操作系统把网络通信中所需的一些系统资源(比如CPU时间,网络带宽等),分配给该程序。操作系统用套接字描述符(实则是一个小的整数)来表示这些资源的总和,然后该套接字描述符会返回给该进程,此后应用程序所有的网络操作(比如收发数据)都要使用这个套接字描述符(就像用open打开文件获得的一个文件描述符,然后write,read都要使用到这个描述符)。在处理系统调用的时候,通过套接字描述符,操作系统就可以识别出应该使用哪些资源来完成应用程序所请求的服务。通信结束后,会调用close系统调用让操作系统回收与该套接字相关的所有资源。