传输层
传输层(Transport Layer)是盘算机网络体系布局中的一个重要层次,它主要负责端到端的通信,确保数据能从一个终端(节点)传到另一个终端(节点)。它是OSI七层模型中的第四层,也是TCP/IP协议中的重要层之一。它主要提供面向连接和无连接的服务。
端对端通信
端对端通信简朴来说就是只关注两个终端之间的直接通信,而忽略了底层网络的差别,为用户提供简朴的网络通信模型。端:终端设备。
我们举个通俗点的例子来理解端对端的通信:
假设此时你在给你的朋友写信,信写完后会通过快递员运输,虽然大概你的信件会经过很多地方,但是这些地方都不会关注你的信件的具体内容(它只有到你朋友这里才会被拆封),最终信件到你朋友这里,逻辑上就好像你们直接通信一样:
端对端通信就像如许,只不过是在网络中,一条信息经过主机A发送给主机B,中心大概经过很多的路由节点,但是这些路由节点只负责传输数据,并不关系具体内容,最终消息会到主机B手中。逻辑上可以以为是这两个终端直接通信。
实现端到端通信的关键技术
- 传输层协议:如前面提到的TCP和UDP。TCP提供了一种面向连接的服务,包管了数据的可靠传输;而UDP则是一种无连接的服务,虽然不包管数据的可靠性,但是具有较低的耽误,适用于及时性要求较高的场景。
- 路由选择:利用IP地址和路由算法决定数据包的最佳路径。尽管路由器不知道所承载的应用层数据的具体意义,但它们根据网络拓扑布局来决定怎样最有效地转发数据包。
- 防火墙与NAT穿越:为了确保端到端的安全性和可访问性,还必要办理诸如防火墙限制和网络地址转换(NAT)带来的挑战。这通常涉及到特定的技术,如STUN、TURN和ICE等,用于帮助创建P2P连接。
下面我们来介绍传输层的两大重要协议:UDP与TCP协议。
UDP协议
再谈端口号
端口号是用来标识某个主机中提供网络服务的历程的,它可以区分不同的提供网络服务的历程,由于主机中大概有很多历程在同一时刻提供网络服务。
在TCP/IP协议中利用源IP、源端口号、目的IP、目的端口号、协议号如许一个五元组来标识一个通信,我们可以利用指令netstat -n来查看:
- Proto:协议(Protocol)。表现利用的网络协议,这里为tcp,表示利用的是TCP协议。
- Recv-Q:接收队列(Receive Queue)。表现连接当前在当地等待上层应用处理的数据量巨细。对于已创建的连接,假如这个值不为0,大概意味着数据没有被及时读取。在这个例子中,它的值是0,表明没有未处理的数据。
- Send-Q:发送队列(Send Queue)。表现连接当前等待远端主机确认的数据量巨细。通常,在连接正常工作时,这个值应该是0,除非远端主机没有正确地确认接收到的数据包。此例中也为0。
- Local Address:当地地址。表现当地盘算机上的IP地址和端口号。这里的127.0.0.1:44636表示这是一个当地回环接口上的连接,即连接发生在本机上,端口号为44636。
- Foreign Address:外部地址。表现远程盘算机的IP地址和端口号。同样地,这里的127.0.0.1:36731表示这也是一个当地回环接口上的连接,端口号为36731。这意味着该连接实际上是在同一台呆板上的两个历程之间进行的通信。
- State:状态。表示TCP连接的状态。常见的状态包罗LISTEN(监听)、ESTABLISHED(已创建)、TIME_WAIT等。这里的TIME_WAIT表示该连接已经完成了正常的关闭过程,但为了确保网络上的所有数据包都被扫除,连接临时保持在这个状态一段时间。
端口号划分
端口号的范围为0~65535,根据注册和用途,大致可以分为以下三类:
- 着名端口:
- 范围:0~1023
- 描述:这些端口通常不会开放给开发者利用,它们用作特殊的服务,为常见的服务器保留。比方:
- 80 HTTP:超文本传输协议,用于网页浏览。
- 443 HTTPS:安全的HTTP连接,通过SSL/TLS加密。
- 25 SMTP:简朴邮件传输协议,用于发送电子邮件。
- 22 SSH:安全外壳协议,用于安全地远程登录到另一台盘算机。
- 注册端口:
- 范围:1024~49151
- 描述:这些端口没有被像着名端口一样严格被定义,它可以开放给开发者利用。尽管云云,很多动态服务也会选择在这个范围内运行,只要不与已知的服务冲突即可。
- 8080 常用作HTTP署理服务器或其他Web服务的备用端口。
- 1433 Microsoft SQL Server 默认实例利用的端口。
- 动态/私有端口
- 范围:49152到65535
- 描述:这些端口主要用于客户端的临时通信。由于客户端一般进行网络服务时,bind源端口号都是体系动态bind,所bind的都是这里面的端口号,由于这些端口是动态分配的,因此不应该长期固定地分配给任何特定的服务。
关于端口号的两个问题
- 一个历程是否可以bind多个端口号。
- 同一个历程是可以bind多个端口号的,假如你想提供不同的服务的话。但是同一个套接字不能bind多个端口号,可以在同一个历程中创建不同的套接字,同时给它们bind不同的套接字,这两个套接字分别用于提供不同的服务。
- 同一个端口号是否可以被多个套接字bind。
- 一般情况下,同一个端口号不能被多个套接字同时bind。每个套接字bind一个特定的IP地址和端口号组合,假如将第二个套接字bind在已经被bind的套接字上,就会bind失败。
- 存在特殊情况,在bind前设置套接字模式为SO_REUSEADDR选项,允很多个套接字绑定到相同的IP地址和端口组合,但这通常仅适用于监听套接字,并且主要用于实现高可用性的服务器架构,此中多个实例可以担当客户端连接,这种情况只是为了让服务器可以快速启动,并不是这个端口被多个服务器bind了,由于服务器在被ctrl C终止后,连接会处于一个TIME_WAIT的状态,以是必要等待一段时间,但是这个只有TCP才会出现这种问题。
UDP协议根本格式
传输层在OS内核中就是布局体数据,比方上面的UDP协议也是可以由布局体来描述其数据的,像http协议一样:
- struct udphdr {
- __u16 source;//源端口号
- __u16 dest;//目的端口号
- __u16 len;//UDP长度
- __u16 check;//校验和
- };
复制代码 相干字段介绍:
16位源端口号:填充本历程在网络通信中利用的端口号。
16位目的端口号:填充通信方在网络通信中利用的端口号。
16位UDP长度:填充UDP数据报的总长度,包罗头部8字节的数据。
16位UDP校验和:虽然UDP是不可靠的,但是还是提供了简朴的数据校验的方法,通常这个校验和的盘算是有一个固定的方式的(与此次通信的协议中的字段相干),通过盘算填充到这个字段中,通过网络传输后再次盘算,假如两次效果不同就证明传输过程中出现了问题。
UDP通信的特点
- 无连接:UDP通信不必要事先创建连接,这一点相信很好理解,假如你学习过UDP套接字通信,编写过UDP网络通信的echo代码的话。
- 不可靠:UDP协议简朴,并没有提供很多对数据查验的方法,以是数据没有TCP可靠。
- 面向数据报:这一点在网络编程中有体现,在创建UDP的套接字时,必要将其设置为SOCK_DGRAM,DGRAM的中文翻译就是数据报。上述UDP的一个协议就构成一个数据报,它是一个独立的实体,每个数据报都有自己的头部和有效载荷。
应用层会把数据交付给传输层,假如传输层利用的是UDP协议,它既不会拆分也不会集并而是原样发送。
example:假设此时调用sendto发送1000字节的数据给客户端,客户端也必须调用recvform一次性接收1000字节,而不能调用10次recvfrom循环接收,由于数据包不会被拆分。
UDP的缓冲区
- UDP没有发送缓冲区,调用sendto后,数据会被交给内核中的传输层(通过不同的套接字交给不同的协议),然后进行相应的封装(添加数据头部),之后由OS交给网络层。
- UDP有接收缓冲区,但是这个接收缓冲区不能包管发送的数据报的次序是否和发送时一致,同时当这个缓冲区满了之后,数据报会被丢弃。
UDP是全双工的,可以同时接收,同时发送。
UDP数据报的最大长度
在IPv4中,理论上最大的UDP数据报长度可以达到65,535字节(由于UDP长度字段是16位,能表示的最大值是65,535)。假如超过了这个值,必要利用者在应用层手动的进行分片。
基于UDP的应用层协议
基于UDP(用户数据报协议)的应用层协议有很多,它们利用了UDP的低耽误、无连接特性,适用于那些对及时性要求较高但可以容忍肯定水平的数据丢失或乱序的应用场景。以下是一些常见的基于UDP的应用层协议:
- DNS (Domain Name System)
- 用途:用于将域名转换为IP地址。
- 为什么利用UDP:DNS查询通常很小且必要快速相应,UDP的低开销和低耽误使其成为理想选择。尽管偶然也会利用TCP,但大多数DNS查询是通过UDP进行的。
- DHCP (Dynamic Host Configuration Protocol)
- 用途:自动分配IP地址和其他网络配置参数给设备。
- 为什么利用UDP:DHCP消息较短且频仍,利用UDP可以镌汰处理时间,提高服从。
- TFTP (Trivial File Transfer Protocol)
- 用途:简朴的文件传输协议,主要用于启动无盘工作站或在网络设备间传输配置文件等。
- 为什么利用UDP:TFTP设计简朴,不提供复杂的错误恢复机制,得当小规模文件传输。
- NTP (Network Time Protocol)
- 用途:同步盘算机时钟到和谐世界时(UTC)。
- 为什么利用UDP:NTP必要高精度的时间同步,UDP的低耽误特性有助于实现这一目的。即使偶然丢失数据包也不会严重影响整体同步精度。
怎样封装UDP报文以及怎样交付UDP报文
- 封装UDP报文:
- 当我们从上层(应用层)拿到数据时,直接在数据的前面添加UDP的报头即可。
- 交付UDP报文:
- 当我们从网络层拿到了一个完整的UDP报文接下来怎样将UDP报文的数据交付给上层应用呢?我们结合UDP协议来画图分析(只关心相干的层):
进一步理解封装和解包
假如仅仅理解封装和解包到图的角度,还是太肤浅了,我们尝试在代码级理解封装和解包。
我们都知道传输层和网络层都属于OS的一部分,OS中是大概存在很多报文的,这些报文还没来得及处理,大概在网络层也大概在传输层的缓冲区,我们必要对这些报文做管理:先描述后构造。
封装:
解包:
以是最终的解包和封装就转化成了指针的加减。
管理报文:
对报文的管理就转化为了对链表的增删查改。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |