TCP 協議簡單說明【PHP 碼農的現身說法】

騷顛顛發表於2019-06-12

本文章簡要的說明該協議的大概內容,具體請百度哦!
TCP協議分為四層【有的分七層】
1、資料鏈路層 【核心該層最重要,上層的協議都基於該層提供的驅動程式來工作的,所以廢話會特別多】
2、網路層
3、傳輸層
4、應用層
資料鏈路層重要協議是ARP協議,其實ARP就是個C語言寫的驅動程式,資料鏈路層重要的東西就是網路卡晶片的驅動程式,網路卡晶片內部含有大量的工作暫存器。圖如下

TCP協議簡單說明
該晶片圖來自於臺灣半導體廠商的資料!【具體晶片圖可聯絡本人獲取哦】 該晶片用於嵌入式系統的乙太網控制器,編寫驅動程式即可實現資料收發功能【tcp,udp僅僅只是一種協議,低層還得依賴晶片的驅動程式,寫過驅動程式的同學應該比較清楚,上層應用都是用下層提供的功能來做的】

內部結構有物理收發器即PHY,Mac,處理器介面,記憶體管理,記憶體隨機暫存器SRAM,MII管理暫存器,包括EEPROM可電擦除暫存器等。

風卡晶片的外部硬體連線圖

TCP 協議簡單說明【PHP 碼農的現身說法】

暫存器是一種具有儲存功能的邏輯電路,它的驅動靠時鐘脈方波訊號驅動其工作,其輸出與輸入及當時的狀態有關,不像組合邏輯電路,暫存器是由大量的觸發器構成的,一個觸發器具有記憶一位二進位制的功能,其輸出與輸入的訊號有關,無非就是0或1,觸發器由閘電路構成【常規的門如與門,或門,非門,與或門,與非門等閘電路,就是實現與,或,非,與或,與非,異或等邏輯運算的電路】這些電路呢由半導體二極體或三極體或場效電晶體元件構成,總之呢記住暫存器具有資料記憶功能就行了。

晶片的功能

TCP 協議簡單說明
它支援了位元組,單位元組,雙位元組指令可訪問內部資料,整合了10、100的收發器,支援IEEE協會的標準,支援喚醒,整合了4k大小的雙位元組暫存器,並且呢EEPROM內在出廠的時候內建了一些資料,使用者可以讀取其資料,相容3.3V和5V的工作電壓,晶片有32位的資料匯流排,支援4個位元組進行訪問。

晶片引腳說明
處理器介面說明:
TCP 協議簡單說明

TCP 協議簡單說明

TCP 協議簡單說明
部分引腳具有輸出和輸入功能即IO,輸入為I,輸入為O,供電為P
有讀指令引腳,寫指令引腳,資料匯流排引腳,資料匯流排都能輸入電壓或輸出電壓【資料】,包括晶片使能引腳,以及地址匯流排引腳用於選中晶片

時鐘脈衝介面

TCP 協議簡單說明

晶片的讀寫操作
一般來說網路卡晶片會連線相應的處理器晶片如微控制器S3C2440或是STM32等這些處理器晶片,網路卡晶片一般支援32位或是16位的資料匯流排,處理器的資料匯流排引腳會連線網路卡晶片的資料引腳如SD0~SD31,其中最重要的是處理器引腳如CMD,IOR#,IOW#,AEN,CMD輸入不同的訊號【高電平或低電平會選擇資料匯流排傳輸過來的是暫存器地址或是寄存的資料】

寫操作
一般是指定暫存器地址,再給暫存器資料,首先是指定TXSRAM暫存器,再往該暫存器寫上資料,通過控制引腳CMD埠的電平訊號,往資料匯流排上寫入要傳送的資料,再使能TX控制器寄存傳送資料,資料的傳送狀態會記錄到TX狀態暫存器和網路狀態暫存器。TXSRAM一般由MWCMD關聯。操作寫時指定該暫存器。再傳送的時候同時要把傳送資料的長度大小也寫入TXPLH,TXPLL的暫存器裡。

讀操作
同樣是指定RXSRAM暫存器,地址是MRCMD指定,網路卡晶片接受到資料時,資料會儲存在RXSRAM暫存器裡,通過指定該暫存器,資料會從資料匯流排SD輸出到處理器【即微控制器】 ,程式會不斷的讀取RXSRAM寄存是否有資料,有資料後直接從資料匯流排獲取輸出的資料即可。

【讀寫一般接的是資料匯流排,不接資料匯流排就得按讀寫時序來處理】
資料的傳送和接受必須知道對方的mac地址,mac地址一般在出廠的時候就寫在相應的暫存器裡了,所以資料在傳輸前會先得到另一塊網路卡晶片的mac地址,mac地址一般是6個位元組,而通常是傳輸對方的ip換回對方的mac地址返回,這一過程就是地址解析即ARP。【arp的請求和響應過程具體可自行查詢資料】

由此得出資料鏈路層的驅動程式在傳送和接受時,需要知道對方的mac地址和要傳送的資料即可。

網路卡晶片的驅動程式主要是為上層提供服務的,反正都是讀資料和寫資料,知道要哪個mac【哪張網路卡】讀寫就可以了。

網路層:
負責資料包的傳輸功能,相關的重要協議如ICMP,IP協議等,它的傳送靠網路卡驅動程式來提供。

傳輸層:
TCP,UDP一個是基於位元組流的傳輸,一個是基於資料包的傳輸,位元組流的傳輸穩定,採用應答機制,具有超時重傳等功能讓資料能完全到達接收端,而UDP則相反。
針對TCP程式設計作業系統提供了socket介面給上層使用,基於此介面開發了一堆應用層協議,如比較常見的http,ftp等協議。
TCP協議說明:
TCP在傳輸資料時會經過tcp打包封裝【反正每一層都封裝,對應的接收端就是分發層層解析】,此層2個重要的引數就是ip,port即地址和埠號,埠號【由使用者指定,一般最多是65535個,有部分埠是系統用的,有部分埠是那些著名的軟體用的埠如80,6379,3306這些玩意用了】 ip嘛不用說,因為ARP驅動在執行時需要知道對方的mac地址,這個ip呢是對方的ip,埠號用於區分是哪個應用程式了,到底是http如web伺服器還是其它伺服器,所以接收時根據port埠號以便區分。

TCP在傳輸的時候會封裝成目的ip,埠,源ip,源埠,32位的序列號,32位的確認號,以及一些標誌位如SYN,ACK,FIN,PUSH,RST等標誌位。 具體圖如下

TCP 協議簡單說明

SYN:是一個連線標誌位,表示傳送端發起了一次連線請求,一般是客戶端發起,如通過socket介面的connect函式傳送一個SYN【此時它時SYN_SENT狀態】,這個時間如果伺服器響應了就會傳送一個確認標誌位 即ACK
確認序列號呢會在32序列號的基礎上加1表示確認此時伺服器處於SYN_RVD狀態,如果客戶也確認了也會傳送ACK應答標誌位此時都處於ESTABLISHED狀態了,雙方就可以互相傳送訊息,以上的過程就是典型的三次握手 【有的人搞四次握手】
通過測試【測試圖片位於本人的github上】

TCP 協議簡單說明

所以當你在呼叫【如你擼的PHP呼叫socket連線函式時客戶端會傳送一次SYN連線請求報文,SYN標誌位會傳送過去,當然伺服器端一般會先啟動,主要是呼叫listen函式時入LISTEN狀態【你用talent命令就能看到伺服器-tcp的狀態了-擼過workerman,swoole或是c的socket API應該清楚了】,此時低層驅動執行後,伺服器接受到後【確認是傳送給自己的】會傳送一個SYN的應答即ACK+1,當客戶端也確認後就連線成功,如果說埠不存在或是埠被佔用了就會連線失敗。

當你客戶端呼叫close函式時,客戶端會傳送一個FIN結束報文,此時客戶端處於FIN_WAIT1狀態,伺服器端確認後即也傳送了ACK應答確認報文,此時伺服器處於CLOSE_WAIT狀態,客戶端也確認了處於FIN_WAIT2狀態,目前這狀態客戶端或是伺服器都能傳送資料,因為還沒有真正的關掉【有的叫半開啟狀態?】如果伺服器也傳送FIN結束報文,此時伺服器端處於【就是伺服器也呼叫了close函式】LAST_LOCK狀態,客戶端如果確認了伺服器就處於CLOSED狀態了,客戶端處於TIME_WAIT狀態【它有一定的生存週期,目的是能確認安全的關閉了,萬一伺服器傳送了FIN報文時,網斷了客戶端沒有收到,然後呢又通網了,它能再次接受到這個報文】

通過分析【我發的測試圖片,你們可以自己去測試不知道的可以百度或是聯絡我】我們得出了TCP確認是採用應答機制,不管是連線,關閉,傳送資料,都要得到對方的答應報文進行確認後再進行下一步的操作。

地址說明:
作業系統提供的地址有通用地址,以及IPV4,IPV6,UNIX地址【具體可以看C語言的相關函式說明】
地址一般提供了IP,PORT,FAMILY即ip,埠號和地址族以及相關的協議族和資料流型別主要有位元組流如SOCK_STREAM和資料包服務如SOCK_DGRAM【UDP協議就是】

當大家對TCP/IP協議瞭解清楚以後,應用層的協議HTTP,FTP,TELNET等協議就簡單了
【驅動工程師才不管這些協議,操作網路卡晶片驅動就能完成區域網的傳輸了】

通過以上簡單的分析大家應該瞭解TCP/IP協議的一個通訊過程了,包括低層驅動也做了簡單的說明。
具體大家可以自行查詢資料補充

本文轉載時請指明來源!謝謝各位

相關文章