當一個用戶端程式要連線伺服器時,用戶端必須有??識別要連線的伺服器的一種方式。因此用戶端知道可以連線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網路服務。 |