看了很多遍,才整理出來我對整個通信過程的理解,大致如下,后期會不斷學習補充更正:
在利用TCP/IP協議族進行通信的時候,有三個比較關鍵的確認身份的信息:mac地址、IP地址和端口號。
- mac地址是在數據鏈路層包裹在以太網頭部中的,它主要用來識別同一個鏈路中的不同計算機。Mac地址即網卡號,每塊網卡出廠的時候,都有一個全世界獨一無二的 MAC 地址,長度是 48 個二進制位,通常用 12 個十六進制數表示。
- IP地址是在網絡層的IP頭部里,用於識別網絡中互聯的主機和路由器,其實主要是確認子網,通過子網掩碼確認某個IP地址所在的子網,而后再在子網內部確認mac地址就能找到准確的用戶了。
- 端口號是在傳輸層包含在TCP/UDP頭部中的,用於識別應用程序。一台主機上能運行多個程序,那么接收到的消息到底是哪個程序的呢?就需要端口號來確認。
端口號有兩種:
-
- 固定的端口號,是形如http,telnet,ftp等廣為使用的應用協議所使用的端口號是固定的
- 動態分配的端口號,這個時候服務端要確定監聽端口號,接受服務的客戶端沒必要確定端口號
端口號由傳輸層協議決定,因此不容傳輸協議可以使用相同的端口號,所以TCP和UDP可以使用同一個端口號
例如,主機A向主機B利用發送了一條消息,則在TCP head里包含了發送消息的應用的端口號以及接收方應用的端口號,傳遞給它的下一層,網絡層會將TCP數據包封裝起來再加自己的頭部,IP頭部里包含本地IP以及接收方IP等信息傳遞給數據鏈路層。數據鏈路層會再給加一個以太網頭部,這里包含雙方的mac地址。那么對方IP和端口號都好得到,可是mac地址如何獲得呢?這個時候需要ARP協議,這個暫且不說,直說在已知mac地址和IP地址端口號情況下如何發送消息。
首先以太網數據包會在其子網內部廣播,如果接收方在其子網內,則在比對mac地址后直接接收數據。如果不在同一個子網內,以太網協議就不能實現數據傳輸了,而且因為以太網協議采取廣播的方式發送消息,就算沒有局限在子網內,如果給非常龐大的主機群廣播消息是非常可怕的。這個時候就需要IP地址了,IP地址主要是用來區分哪些mac地址在同一個子網。找到目的主機所在子網之后再根據mac地址確認主機,IP層從IP首部確定數據包所用的協議之后將數據包交給對應的協議,再由協議來確認程序的端口號,從而實現了消息的傳遞