参考大佬的文章https://www.cnblogs.com/cxuanBlog/p/14059379.html
一、宏观架构中的传输层
在计算机中,任何一个可以交换信息的介质都可以称为端系统。计算机网络的运输层则负责把报文从一端运输到另一端,运输层实现了让两个互不相关的主机进行了逻辑通信的功能,看起来像是让两个主机相连一样。
数据包的结构如上图所示,数据包经过每层后,该层协议都会在数据包附上包首部,而当数据包经过传输层之后,会为其附上TCP首部,首部包含着源端口号和目的端口号。在发送端运输层将从发送应用程序接收到的报文转化为运输层分组,分组也被称为报文段(segment)。运输层一般会将报文段进行分割,分成较小的块,为每一块加上运输层首部并将其向目的地发送。
在运输层发送的过程中,可以选择的运输层协议主要有TCP和UDP。
二、谈谈一些基础概念
1、TCP和UDP
2、套接字
(1)socket的概念
socket实际上与TCP/IP没有必然联系,socket的出现只是方便了TCP/IP的使用 。可以直接使用下面Socket API的这些方法
(2)socket API方法
create():创建一个socket
bind():socket的标识,一般用于绑定端口号
listen():准备接收连接
connect():准备充当发送者
accept():准备充当接收者
write():发送数据
read():接收数据
close():关闭连接
(3)套接字处理过程
1是指调用create方法创建通信链路中的端点,创建完成后会返回描述该套接字的套接字描述符
2是指调用bind方法应用程序通过套接字描述符将唯一的名称绑定在套接字上,服务器必须绑定一个名称才能在网络中访问
3是指调用listen方法表示客户端愿意等待连接的意愿
4是指客户端应用程序调用connect方法发起与服务器的连接请求
5是指服务器应用程序使用accept API接受客户端连接请求
6是指在流套接字之间建立连接后,客户端和服务器之间就可以发起read/write API调用了
7是指当服务器或者客户端要停止操作时,调用close API释放套接字获取的所有系统资源
但是注意socket API不属于通信模型,socket API允许应用程序与传输层和网络层进行交互
为了方便资源的使用,提高机器的性能、利用率和稳定性等原因,我们的计算机都有一层软件叫做操作系统,它用于帮助我们管理计算机可以使用的资源,当我们的计算机要使用一个资源的时候,可以向操作系统申请,再由操作系统为我们分配和管理资源。通常我们要访问一个内核设别或者文件时,程序可以调用系统函数,系统就会为我们打开设备或者文件,然后返回一个文件描述符fd(或者称为ID,是一个整数),我们要访问该设备或者文件,只能通过你该文件描述符。
同理当我们使用网络时,要使用到对应的操作系统的操作和网络设备,所以我们可以向操作系统申请,然后系统会为我们创建一个套接字socket,并返回这个socket的ID,以后我们的程序要使用网络资源,只要向这个socket的编号ID操作即可、而我们每个网络进程至少对应着一个socket,向socket中的ID写数据,相当于是向网络发送数据,向socket中读数据,相当于是接收数据。
(4)端口
端口号是16位的非负整数,范围是0~65535之间,分为三种,
第一种是周知/标准端口号,范围是0~1023;
第二种是注册端口号,范围是1024~49151;
私有端口号,范围是49152~65535;
当一个报文到达服务器时,通过端口号来区分不同的应用程序,但是仅仅依靠端口号来确定某一条报文是不够的。互联网上一般使用源IP地址、目标IP地址、源端口号、目标端口号来进行区分。若果其中的某一项不同,就认为是不同的报文段。
而确认端口号的方法有两种,
第一种是标准既定的端口号,例如SSH使用22标识,FTP采用21标识,HTTP采用80标识;
第二种是时序分配的端口号,凭借操作系统为每个应用程序分配互不冲突的端口号;
(5)多路复用和多路分解
多路复用就是指从多个socket接收数据,为每块数据封装上头部信息,生成报文段,交给网络层
多路分解就是指依据头部信息将收到的报文段交给对应的socket,即不同的进程
如上图所示,多路复用体现在从主机1和主机3的不同的socket接收数据,并为每块数据封装上头部信息生成报文段。
多路分解体现在将接收到的不同的报文段交给对应的socket,即不同的进程。
(i)无连接的多路复用和多路分解
主要用于UDP协议,UDP套接字是一个二元组,这个二元组包含目的IP和目的端口,主机在收到UDP段后检查段中的目的端口号,将UDP段导向绑定在该端口号的socket。
(ii)面向连接的的多路复用和多路分解
TCP的socket用四元组来标识:源IP、源目端口号、目标IP、目标端口号
接收端利用所有的四个值将报文导向合适的socket,服务器可能支持多个TCP socket,每个socket用自己的四元组唯一标识
如上图所示,主机C向主机B发起了两个HTTP请求(具有着不同的源端口号),主机A向主机B发起了一个HTTP请求,主机A、B、C都有自己唯一的IP地址,当主机C发出这两个HTTP请求后,正因为这两个HTTP请求具有着不同的源端口号所以主机B能够分解这两个HTTP连接。而对于主机A和主机C来说,这两个主机有着不同的IP地址,所以对于主机B来说也能够进行分解。