1. 程式人生 > >TCP與SOCKET的三次握手的對應關係

TCP與SOCKET的三次握手的對應關係

TCP/IP

要想理解socket首先得熟悉一下TCP/IP協議族,TCP/IPTransmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,定義了主機如何連入因特網及資料如何再它們之間傳輸的標準,

從字面意思來看TCP/IP是TCP和IP協議的合稱,但實際上TCP/IP協議是指因特網整個TCP/IP協議族。不同於ISO模型的七個分層,TCP/IP協議參考模型把所有的TCP/IP系列協議歸類到四個抽象層中

應用層:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

傳輸層:TCP,UDP

網路層:IP,ICMP,OSPF,EIGRP,IGMP

資料鏈路層:SLIP,CSLIP,PPP,MTU

每一抽象層建立在低一層提供的服務上,並且為高一層提供服務,看起來大概是這樣子的

                       

估計有興趣開啟此文的同學都對此有一定了解了,加上我也是一知半解,所以就不詳細解釋,有興趣同學可以上網上搜一下資料

維基百科

百度百科

在TCP/IP協議中兩個因特網主機通過兩個路由器和對應的層連線。各主機上的應用通過一些資料通道相互執行讀取操作

socket

我們知道兩個程序如果需要進行通訊最基本的一個前提能能夠唯一的標示一個程序,在本地程序通訊中我們可以使用PID來唯一標示一個程序,但PID只在本地唯一,網路中的兩個程序PID衝突機率很大,這時候我們需要另闢它徑了,我們知道IP層的ip地址可以唯一標示主機,而TCP層協議和埠號可以唯一標示主機的一個程序,這樣我們可以利用ip地址+協議+埠號唯一標示網路中的一個程序。

能夠唯一標示網路中的程序後,它們就可以利用socket進行通訊了,什麼是socket呢?我們經常把socket翻譯為套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象為幾個簡單的介面供應用層呼叫已實現程序在網路中通訊。

socket起源於UNIX,在Unix一切皆檔案哲學的思想下,socket是一種"開啟—讀/寫—關閉"模式的實現,伺服器和客戶端各自維護一個"檔案",在建立連線開啟後,可以向自己檔案寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉檔案。

socket通訊流程

socket是"開啟—讀/寫—關閉"模式的實現,以使用TCP協議通訊的socket為例,其互動流程大概是這樣子的

伺服器根據地址型別(ipv4,ipv6)、socket型別、協議建立socket

伺服器為socket繫結ip地址和埠號

伺服器socket監聽埠號請求,隨時準備接收客戶端發來的連線,這時候伺服器的socket並沒有被開啟

客戶端建立socket

客戶端開啟socket,根據伺服器ip地址和埠號試圖連線伺服器socket

伺服器socket接收到客戶端socket請求,被動開啟,開始接收客戶端請求,直到客戶端返回連線資訊。這時候socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連線資訊後才返回,開始接收下一個客戶端諒解請求

客戶端連線成功,向伺服器傳送連線狀態資訊

伺服器accept方法返回,連線成功

客戶端向socket寫入資訊

伺服器讀取資訊

客戶端關閉

伺服器端關閉

三次握手

在TCP/IP協議中,TCP協議通過三次握手建立一個可靠的連線

第一次握手:客戶端嘗試連線伺服器,向伺服器傳送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待伺服器確認

第二次握手:伺服器接收客戶端syn包並確認(ack=j+1),同時向客戶端傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態

第三次握手:第三次握手:客戶端收到服務器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手

定睛一看,伺服器socket與客戶端socket建立連線的部分其實就是大名鼎鼎的三次握手

 socket程式設計API

前面提到socket是"開啟—讀/寫—關閉"模式的實現,簡單瞭解一下socket提供了哪些API供應用程式使用,還是以TCP協議為例,看看Unix下的socket API,其它語言都很類似(PHP甚至名字都幾乎一樣),這裡我就簡單解釋一下方法作用和引數,具體使用有興趣同學可以看看部落格參考中的連結或者上網搜尋

int socket(int domain, int type, int protocol);

根據指定的地址族、資料型別和協議來分配一個socket的描述字及其所用的資源。

domain:協議族,常用的有AF_INETAF_INET6AF_LOCALAF_ROUTE其中AF_INET代表使用ipv4地址

type:socket型別,常用的socket型別有,SOCK_STREAMSOCK_DGRAMSOCK_RAWSOCK_PACKETSOCK_SEQPACKET

protocol:協議。常用的協議有,IPPROTO_TCPIPPTOTO_UDPIPPROTO_SCTPIPPROTO_TIPC

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

把一個地址族中的特定地址賦給socket

sockfd:socket描述字,也就是socket引用

addr:要繫結給sockfd的協議地址

addrlen:地址的長度

通常伺服器在啟動的時候都會繫結一個眾所周知的地址(如ip地址+埠號),用於提供服務,客戶就可以通過它來接連伺服器;而客戶端就不用指定,有系統自動分配一個埠號和自身的ip地址組合。這就是為什麼通常伺服器端在listen之前會呼叫bind(),而客戶端就不會呼叫,而是在connect()時由系統隨機生成一個。

int listen(int sockfd, int backlog);

監聽socket

sockfd:要監聽的socket描述字

backlog:相應socket可以排隊的最大連線個數 

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

連線某個socket

sockfd:客戶端的socket描述字

addr:伺服器的socket地址

addrlen:socket地址的長度

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

 TCP伺服器監聽到客戶端請求之後,呼叫accept()函式取接收請求

sockfd:伺服器的socket描述字

addr:客戶端的socket地址

addrlen:socket地址的長度

ssize_t read(int fd, void *buf, size_t count);

讀取socket內容

fd:socket描述字

buf:緩衝區

count:緩衝區長度

ssize_t write(int fd, const void *buf, size_t count);

向socket寫入內容,其實就是傳送內容

fd:socket描述字

buf:緩衝區

count:緩衝區長度

int close(int fd);

socket標記為以關閉使相應socket描述字的引用計數-1,當引用計數為0的時候,觸發TCP客戶端向伺服器傳送終止連線請求。

相關推薦

抓包查看TCP/IP 的握手分手

請求報文 無聊 技術分享 表示 新的 回復 握手 字段 inf 閑的無聊,自己折騰了個三次握手與四次分手,不正確的地方請大家批評 10.0.0.1 主機A10.0.0.200 主機B 1)由主機A向B發送建立TCP連接的請求報文,請求報文中SYN字段設置為1,表示需要建立

tcp建立的握手斷開時的四揮手

原文:https://www.cnblogs.com/Jessy/p/3535612.html   TCP的三次握手(建立連線)和四次揮手(關閉連線) 參照: http://course.ccniit.com/CSTD/Linux/reference/files/018.P

TCP握手揮手過程,各個狀態名稱含義 握手(轉載)

TCP的三次握手與四次揮手過程,各個狀態名稱與含義 三次握手 第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=10001的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機,此時狀態為SYN_SENT; 第二次握手:主機B收到請求後要確

深入淺出之 TCP協議(握手揮手、超時重發、流量控制、擁塞控制、UDP區別)

TCP/IP 中有兩個具有代表性的傳輸層協議,分別是TCP、UDP。TCP提供可靠的通訊傳輸,而UDP則常被用於讓廣播和細節控制交給應用的通訊傳輸。 要知道TCP為了這簡單描述“可靠的通訊傳輸”背後所做的努力,你會深感佩服其強大性。TCP的特徵:序列化+確認應

面試——socket以及tcp/ip的握手通訊

socket是用來客戶端和伺服器之間建立連線的一個組建,建立連線的過程是三次握手的過程,客戶端向伺服器傳送訊息,問伺服器在不在,客戶端要和它進行連線了,伺服器接收到後,伺服器向瀏覽器傳送訊息表明自己在,並問客戶端能收到伺服器傳送的訊息嗎?客戶端接收到訊息後,再向伺服器傳送訊息

TCP/IP協議握手握手流程

(1)第一次握手:Client將標誌位SYN設定為1,隨機產生一個值seq=x,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Server確認。(2)第二次握手:Server收到資料包後由標誌位SYN=1知道Client請求建立連線,Server將標誌位SYN和ACK都置為1,ac

TCP/IP的握手握手

一、TCP報文格式   TCP/IP協議的詳細資訊參看《TCP/IP協議詳解》三卷本。下面是TCP報文格式圖: 圖1 TCP報文格式   上圖中有幾個欄位需要重點介紹下:   (1)序號:Seq序號,佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。   (2)確認序號:A

[計算機網路協議分析]TCP/IP協議握手握手流程解析

TCP/IP協議三次握手與四次握手流程解析 一、TCP報文格式 TCP/IP協議的詳細資訊參看《TCP/IP協議詳解》三卷本。下面是TCP報文格式圖: 圖1 TCP報文格式 上圖中有幾個欄位需要重點介紹下: (1)序號:Seq序號,佔3

詳解TCP連線的“握手“四揮手”(上)

一、TCP connection 客戶端與伺服器之間資料的傳送和返回的過程當中需要建立一個叫TCP connection的東西; 由於TCP不存在連線的概念,只存在請求和響應,請求和響應都是資料包,它們之間都是經過由TCP建立的一個從客戶端發起,伺服器接收的類似連線的通道,這個連線可以一直保持,ht

詳解TCP連線的“握手“四揮手”(下)

上文連結: 詳解TCP連線的“三次握手”與“四次揮手”(上) 四、TCP的四次揮手(Four-Way Wavehand) 0.前言 對於"三次握手"我們耳熟能詳,因為其相對的簡單。但是,我們卻不常聽見“四次揮手”,就算聽過也未必能詳細地說明白它的具體過程。下面就為大家詳盡,直觀,完

【極客思考】計算機網路:Wireshark抓包分析TCP中的握手揮手

【摘要】本文重點分析計算機網路中TCP協議中的握手和揮手的過程。 【前提說明】 前段時間突然看到了一篇關於TCP/IP模型的文章,心想這段時間在家裡也用wireshark抓了點包,那麼想著想著就覺得需要複習一下網路知識,於是就有這篇博文的誕生。當然網上關於TCP相關的知識點也是芸芸,閒著無事也可以多googl

TCP協議的握手和四揮手

揮手 這一 nbsp 服務端 msl cnblogs chm 可靠的 不相信 TCP報文段格式圖: 序號:seq序號,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。 確認號:ack序號,只有ACK標誌位為1時,確認序號字段才有效,Ack=seq+1

tcp、的握手和四揮手

.com 服務端 server 成功 四次揮手 fin CP 產生一個隨機數 再次 TCP 三次握手第一次: 客戶端將標誌位SYN置為1,隨機產生一個值seq=x,並將該數據包發送給服務端,客戶端進入等待狀態,等待服務端確認。第二次: 服務端收到數據包後確認SYN=1

TCP/IP協議握手和四揮手大白話解說

ini 存在 detail 系統 超時 定時 com 又能 ssi TCP/IP協議三次握手和四次揮手大白話解說 前言 昨天晚上被一位師傅問到了TCP/IP的工作機制,心裏很清楚三次握手,然而對於四次揮手卻忘了,這是大學習裏學過的,奮而翻閱書籍和網絡對之前所學的做一個溫

通俗大白話來理解TCP協議的握手和四分手

network層 三次 udp 三層 等了 吃飯 號碼 adc ip首部 通俗理解: 但是為什麽一定要進行三次握手來保證連接是雙工的呢,一次不行麽?兩次不行麽?我們舉一個現實生活中兩個人進行語言溝通的例子來模擬三次握手。 引用網上的一些通俗易懂的例子,雖然不太正確,後面會

【轉】Linux下從TCP狀態機,握手判斷DDOS攻擊

pla rep img 實體 -s lar 連接狀態 sdn 類型 從TCP狀態機判斷DDOS攻擊 一、TCP協議 TCP 協議是傳送層的核心協議,提供了可靠面向連接的協議,分為三次握手和四次斷開,在這個過程中TCP有個狀態機,記錄不同階段的狀態。 二、 TCP握手和斷開

通俗理解TCP/IP協議握手分手流程

https 客戶端 四次揮手 謝謝 special csdn tails spec 走了 轉自:https://blog.csdn.net/special23/article/details/54137298 三次握手流程 客戶端發個請求“開門吶,我要進

TCP協議的握手和四揮手(詳細圖解)

TCP的概述 TCP把連線作為最基本的物件,每一條TCP連線都有兩個端點,這種斷點我們叫作套接字(socket),它的定義為埠號拼接到IP地址即構成了套接字,例如,若IP地址為192.3.4.16 而埠號為80,那麼得到的套接字為192.3.4.16:80。  T

tcp協議的握手揮手

第一次握手:建立連線時,客戶端傳送syn包到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN:同步序列編號 第二次握手:伺服器收到syn包,必須確認客戶的SYN,同時自己也傳送一個SYN包和一個ack包,此時伺服器進入SYN_RECV狀態; 第三次握手:客戶端收到伺服器的SYN包和ACK包,

tcp協議的握手和四握手

thrillerz 我的架構師之路 部落格園 首頁 新隨筆 聯絡 訂閱 管理