Socket 端口和服務
當一個客戶端程序要連接服務器時,客戶端必須有識彆要連接的服務器的一種方式。因此客戶端知道可以連接32位網絡地址的主機服務器所在的主機。但是,客戶端如何識彆特定的服務器在該主機上運行的進程呢?
要解決的問題是要確定一個特定的服務器一台主機上運行的進程,TCP和UDP定義一組眾所周知的端口。
對於我們的目的,端口將被定義為1024和65535之間的整數。這是因為所有小於1024的端口號被認為是眾所周知的 - 例如telnet使用端口23,HTTP使用80,FTP使用21,依此類推。
在文件/etc/services中可以找到網絡服務端口分配。如果你正在寫你自己的服務器,那麼必須小心分配一個端口連接到服務器。應該確保該端口應該冇有被其他的服務器分配到(占用)。
它的做法通常指定端口大於5000。但也有許多機構寫自己的服務器端口號大於5000。例如雅虎信使運行端口號為:5050,5060等SIP服務器上運行
端口和服務實例:
這裡是一個小的服務和相關端口列表。可以找到最新的互聯網端口和相關的服務列表 IANA - TCP/IP Port Assignments.
服務 | 端口號 | 服務描述 |
echo | 7 | UDP/TCP sends back what it receives |
discard | 9 | UDP/TCP throws away input |
daytime | 13 | UDP/TCP returns ASCII time |
chargen | 19 | UDP/TCP returns characters |
ftp | 21 | TCP file transfer |
telnet | 23 | TCP remote login |
smtp | 25 | TCP email |
daytime | 37 | UDP/TCP returns binary time |
tftp | 69 | UDP trivial file transfer |
finger | 79 | TCP info on users |
http | 80 | TCP World Wide Web |
login | 513 | TCP remote login |
who | 513 | UDP different info on users |
Xserver | 6000 | TCP X windows (N.B. >1023) |
端口服務功能:
UNIX提供了以下功能從/etc/services文件獲取服務名稱.
-
struct servent *getservbyname(char *name, char *proto): - 這個調用需要的服務名稱和協議名稱,並返回該服務對應的端口號。
-
struct servent *getservbyport(int port, char *proto): - 此調用需要的端口號和協議名稱,並返回相應的服務名稱。
每個函數的返回值是一個指針,指向的結構與下麵的形式:
struct servent { char *s_name; char **s_aliases; int s_port; char *s_proto; }; |
這裡是成員字段的描述:
屬性 | 值 | 描述 |
---|---|---|
s_name | http | 這是官方的服務名稱。例如SMTP,FTP POP3等。 |
s_aliases | ALIAS | 其將存放服務彆名的列表。大部分的時間將被設置為NULL。 |
s_port | 80 | 這將有相關聯的端口號。例如HTTP,為80。 |
s_proto |
TCP UDP |
這將被設置為所使用的協議。使用TCP或UDP網絡服務。 |