Socket、描述符、端口号
端口:
端口与进程对应:
TCP 的包是不包含 IP 地址信息的,那是 IP 层上的事,但是有源端口和目的端口。
就是说,端口这一东西,是属于 TCP 知识范畴的。
我们知道两个进程,在计算机内部进行通信,可以有管道、内存共享、信号量、消息队列等方法。
而两个进程如果需要进行通讯最基本的一个前提是能够唯一的标识一个进程,在本地进程通讯中我们可以使用 「PID(进程标识符)」 来唯一标识一个进程。
但 PID 只在本地唯一,如果把两个进程放到了不同的两台计算机,然后他们要通信的话,PID 就不够用了,这样就需要另外一种手段了。
解决这个问题的方法就是在运输层使用 「协议端口号 (protocol port number)」,简称 「端口 (port)」.
我们知道 IP 层的 ip 地址可以唯一标识主机,而 TCP 层协议和端口号可以唯一标识主机的一个进程,这样我们可以利用:「ip地址+协议+端口号」唯一标示网络中的一个进程。
在一些场合,也把这种唯一标识的模式称为「套接字 (Socket)」。
服务器端口:
- 熟知端口:范围从0到1023
应用程序 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | HTTPS | SNMP |
---|---|---|---|---|---|---|---|---|
熟知端口号 | 21 | 23 | 25 | 53 | 69 | 80 | 443 | 161 |
- 动态端口:范围从1024到65535。不固定分配某种服务,而是动态分配。动态分配是指一个系统进程或者引用程序需要网络通信时,它向主机申请一个端口,主机从可用端口号中分配一个供他使用。
客户端端口
取值范围:49152 ~ 65535。
这类端口仅在客户端进程运行时才动态选择。
又叫 短暂端口号,表示这种端口的存在时间是短暂的,客户进程并不在意操作系统给它分配的是哪一个端口号,因为客户进程之所以必须有一个端口号,是为了让传输层的实体能够找到自己。
描述符
基本概念
一个TCP连接的套接字对(socket pair)是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口、外地地址、外地TCP端口。套接字对唯一标识一个网络上的每个TCP连接。
标识每个端口的两个值(IP地址和端口号)通常称为一个套接字。
Socket最初作为UNIX操作系统的一部分而开发的,所以其API和系统其他IO设备集成在一起,当创建一个Socket是,操作系统返回一个int型的变量作为描述符,用来标志这个Socket,然后应用程序通过该描述符作为传递参数,通过调用函数来完成收发网络数据。
Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。 Socket执行体为你管理描述符表。
理解:描述符就类似于Java中的引用变量,而操作系统中的C语言并没有面向对象,没有引用变量和对象之说,因此需要用描述符来指向之前创建的Socket数据结构,来操纵它完成网络操作。
总结:
如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制 。
来自:
https://github.com/JerryC8080/understand-tcp-udp
https://www.cnblogs.com/davidzhou11225/archive/2012/05/03/2480347.html
《网络是怎样连接的》