本文章簡要的說明該協議的大概內容,具體請百度哦!
TCP協議分爲四層【有的分七層】
圖片來源於德州儀器網卡芯片的datasheet
git
一、數據鏈路層 【核心該層最重要,上層的協議都基於該層提供的驅動程序來工做的,因此廢話會特別多】
二、網絡層
三、傳輸層
四、應用層
數據鏈路層重要協議是ARP協議,其實ARP就是個C語言寫的驅動程序,數據鏈路層重要的東西就是網卡芯片的驅動程序,網卡芯片內部含有大量的工做寄存器。圖以下 github
該芯片圖來自於臺灣半導體廠商的資料!【具體芯片圖可聯繫本人獲取哦】 該芯片用於嵌入式系統的以太網控制器,編寫驅動程序便可實現數據收發功能【tcp,udp僅僅只是一種協議,低層還得依賴芯片的驅動程序,寫過驅動程序的同窗應該比較清楚,上層應用都是用下層提供的功能來作的】 web
內部結構有物理收發器即PHY,Mac,處理器接口,內存管理,內存隨機寄存器SRAM,MII管理寄存器,包括EEPROM可電擦除寄存器等。 編程
風卡芯片的外部硬件鏈接圖 安全
寄存器是一種具備存儲功能的邏輯電路,它的驅動靠時鐘脈方波信號驅動其工做,其輸出與輸入及當時的狀態有關,不像組合邏輯電路,寄存器是由大量的觸發器構成的,一個觸發器具備記憶一位二進制的功能,其輸出與輸入的信號有關,無非就是0或1,觸發器由門電路構成【常規的門如與門,或門,非門,與或門,與非門等門電路,就是實現與,或,非,與或,與非,異或等邏輯運算的電路】這些電路呢由半導體二極管或三極管或場效應管元件構成,總之呢記住寄存器具備數據記憶功能就好了。 服務器
芯片的功能 swoole
它支持了字節,單字節,雙字節指令可訪問內部數據,集成了十、100的收發器,支持IEEE協會的標準,支持喚醒,集成了4k大小的雙字節寄存器,而且呢EEPROM內在出廠的時候內置了一些數據,用戶能夠讀取其數據,兼容3.3V和5V的工做電壓,芯片有32位的數據總線,支持4個字節進行訪問。 網絡
芯片引腳說明
處理器接口說明:
socket
部分引腳具備輸出和輸入功能即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等標誌位。 具體圖以下
SYN:是一個鏈接標誌位,表示發送端發起了一次鏈接請求,通常是客戶端發起,如經過socket接口的connect函數發送一個SYN【此時它時SYN_SENT狀態】,這個時間若是服務器響應了就會發送一個確認標誌位 即ACK
確認序列號呢會在32序列號的基礎上加1表示確認此時服務器處於SYN_RVD狀態,若是客戶也確認了也會發送ACK應答標誌位此時都處於ESTABLISHED狀態了,雙方就能夠互相發送消息,以上的過程就是典型的三次握手 【有的人搞四次握手】
經過測試【測試圖片位於本人的github上】
因此當你在調用【如你擼的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協議的一個通訊過程了,包括低層驅動也作了簡單的說明。
具體你們能夠自行查找資料補充
本文轉載時請指明來源!謝謝各位