1.传输层
在学习HTTP等应用层协议时,为了便于理解,可以简单的认为HTTP协议是将请求和响应直接发送到了网络当中。但实际应用层需要先将数据交给传输层,由传输层对数据做进一步处理后再将数据继续向下进行交付,该过程贯穿整个网络协议栈,最终才能将数据发送到网络当中。
传输层负责可靠性传输,确保数据能够可靠地传送到目标地址。为了方便理解,在学习传输层协议时也可以简单的认为传输层协议是将数据直接发送到了网络当中。
1.1.再谈端口号
端口号的作用:
端口号(Port)标识一个主机上进行网络通信的不同的应用程序。当主机从网络中获取到数据后,需要自底向上进行数据的交付,而这个数据最终应该交给上层的哪个应用处理程序,就是由该数据当中的目的端口号来决定的。
从网络中获取的数据在进行向上交付时,在传输层就会提取出该数据对应的目的端口号,进而确定该数据应该交付给当前主机上的哪一个服务进程。
因此端口号是属于传输层的概念的,在传输层协议的报头当中就会包含与端口相关的字段。
五元组标识一个通信:
在TCP/IP协议中,用“源IP地址”,“源端口号”,“目的IP地址”,“目的端口号”,“协议号”这样一个五元组来标识一个通信。
比如有多台客户端主机同时访问服务器,这些客户端主机上可能有一个客户端进程,也可能有多个客户端进程,它们都在访问同一台服务器。
而这台服务器就是通过“源IP地址”,“源端口号”,“目的IP地址”,“目的端口号”,“协议号”来识别一个通信的。
• 先提取出数据当中的目的IP地址和目的端口号,确定该数据是发送给当前服务进程的。
• 然后提取出数据当中的协议号,为该数据提供对应类型的服务。
• 最后提取出数据当中的源IP地址和源端口号,将其作为响应数据的目的IP地址和目的端口号,将响应结果发送给对应的客户端进程。通过 netstat -nltp 命令可以查看到这样的五元组信息,如下图所示,其中的Local Address表示的就是源IP地址和源端口号,Foreign Address表示的就是目的IP地址和目的端口号,而Proto表示的就是协议类型。
协议号 VS 端口号:
• 协议号是存在于IP报头当中的,其长度是8位。协议号指明了数据报所携带的数据是使用的何种协议,以便让目的主机的IP层知道应该将该数据交付给传输层的哪个协议进行处理。
• 端口号是存在于UDP和TCP报头当中的,其长度是16位。端口号的作用是唯一标识一台主机上的某个进程。
• 协议号是作用于传输层和网络层之间的,而端口号是作用于应用层于传输层之间的。
1.2.端口号范围划分
端口号的长度是16位,因此端口号的范围是0 ~ 65535:
• 0 ~ 1023:知名端口号。比如HTTP,FTP,SSH等这些广为使用的应用层协议,它们的端口号都是固定的。
• 1024 ~ 65535:操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个范围分配的。
1.3.认识知名端口号
常见的知名端口号:
有些服务器是非常常用的,这些服务器的端口号一般都是固定的:
• ssh,服务器使用22端口。
• ftp,服务器使用21端口。
• telnet,服务器使用23端口。
• http,服务器使用80端口。
• https,服务器使用443端口。
查看知名端口号:
在/etc/services路径下有一个services配置文件,该文件中列举了常见服务与其匹配的端口号,如下图所示。
文件中的每一行对应一种服务,它由4个字段组成,每个字段之间用TAB或空格分隔,分别表示“服务名称”、“使用端口”、“协议名称”以及“别名”。
1.4.两个问题
问题1:一个端口号是否可以被多个进程绑定?
答:一个端口号绝对不能被多个进程绑定,因为端口号的作用就是唯一标识一个进程,如果绑定一个已经被绑定的端口号,就会出现绑定失败的问题。问题2:一个进程是否可以绑定多个端口号?
答:一个进程是可以绑定多个端口号的,这与“端口号必须唯一标识一个进程”是不冲突的,只不过现在这多个端口唯一标识的是同一个进程罢了。我们限制的是从端口号到进程的唯一性,而没有要求从进程到端口号也必须满足唯一性,因此一个进程是可以绑定多个端口号的。
1.5.netstat命令
netstat命令:
功能:netstat是一个用来查看网络状态的重要工具。
常见选项:
• n:拒绝显示别名,能显示数字的全部转换成数字。
• l:仅列出处于LISTEN(监听)状态的服务。
• p:显示建立相关链接的程序名。
• t(tcp):仅显示tcp相关的选项。
• u(udp):仅显示udp相关的选项。
• a(all):显示所有的选项,默认不显示LISTEN相关。
注:1.查看TCP相关的网络信息时,一般选择使用nltp组合选项。
2.而查看UDP相关的网络信息时,一般选择使用nlup组合选项。
3.如果想查看LISTEN状态以外的连接信息,可以去掉l选项,此时就会将处于其他状态的连接信息显示出来。
1.6.pidof命令
pidof命令可以通过进程名,查看进程id。
注:pidof命令可以配合kill命令快速杀死一个进程。
2.UDP协议
2.1.UDP协议格式
UDP协议的位置:
网络套接字编程时用到的各种接口,是位于应用层和传输层之间的一层系统调用接口,这些接口是系统提供的,我们可以通过这些接口搭建上层应用,比如HTTP。我们经常说HTTP是基于TCP的,实际就是因为HTTP在TCP套接字编程上搭建的。
而socket接口往下的传输层实际就是由操作系统管理的,因此UDP是属于内核当中的,是操作系统本身协议栈自带的,其代码不是由上层用户编写的,UDP的所有功能都是由操作系统完成,因此网络也是操作系统的一部分。