1. 程式人生 > >TCP介紹及TCP網路程式設計

TCP介紹及TCP網路程式設計

一、TCP頭部結構:
這裡寫圖片描述
①16位埠號及16位目的埠號:告知主機該報文段來自哪裡(源埠)要傳給那個上層協議或應用程式(目的埠)。
②32位序號:一次TCP通訊過程中某一個傳輸方向上的位元組流的每個位元組的編號。A傳送給B的第一個報文段中,序號值被系統初始化為某個隨機值ISN,後續在該方向上的TCP報文段的序號值被設定為ISN加上該報文段所攜帶資料的第一個位元組在整個位元組流中的偏移。
③32位確認號:另一方對TCP報文段的響應,其值是收到的TCP報文段的序號值加1。
④4位頭部長度:標識該TCP頭部有多少個32位(4位元組,即有多少行)。4位最大能表示15,所以TCP頭部最長是60位元組。
⑤6位標誌:
5.1 URG標誌:緊急指標是否有效。
5.2 ACK標誌:確認號是否有效。確認報文段。
5.3 PSH標誌:提示接收端應用程式應該立即從TCP接受緩衝區中讀走資料,為接受後續資料騰出空間。TCP緩衝區 在網絡卡上,有大小限制,如果應用程式一直不讀取就會一直在緩衝區,影響後續資料。
5.4 RST標誌:表示要求對方重新建立連線。復位報文段。
5.5 SYN標誌:請求建立連線。同步報文段。
5.6 FIN標誌:通知對方本段要關閉連線。結束報文段。
⑥16位視窗大小:TCP流量控制。接收通告視窗告訴對方本端的TCP緩衝區還能接收多大位元組的資料,避免發過來接收不了而造成的資料丟失。
⑦16位校驗和:檢驗TCP報文段在傳輸過程中是否損壞。
⑧16位緊急指標:緊急資料先處理。

二、TCP三次握手以及四次揮手(本文都以客戶端先發送請求為例)
這裡寫圖片描述
三次握手建立連線:
①請求連線方(客戶端)傳送SYN請求連線;
②伺服器返回SYN/ACK確認收到傳送端請求;
③客戶端回饋給伺服器ACK,表示確認收到伺服器傳送的確認。

注:1、如果伺服器沒有收到客戶端傳送的ACK,則啟動超時重傳機制,這確保了TCP連線的準確性。
2、TCP的握手至少有三次,不可再少。

四次揮手斷開連線:
①請求方(客戶端)資料已經發送完畢,向伺服器傳送FIN請求斷開連線;
②伺服器向客戶端傳送ACK,對客戶端傳送的FIN進行確認,並不需要即使斷開;
③伺服器將接收到的資料處理完畢後傳送FIN,斷開連線;
④客戶端傳送確認訊息ACK。

注:1、應答方(伺服器)給在請求方(客戶端)傳送第一個ACK之後,可能還需要一段時間來處理請求方傳送的資料。
2、如果在應答方(伺服器)給請求方(客戶端)傳送第一個ACK後,伺服器可能已經處理完了所有的資料,此時四次揮手可以縮短為三次。
3、TIME_WAIT狀態:出現在主動發起斷開連結請求的一端。
意義:
    3.1、 保證可靠的終止TCP連結
    3.2、 保證遲來的資料報能被識別並丟棄

三、總狀態轉移圖
這裡寫圖片描述這裡寫圖片描述

四、TCP程式設計
伺服器:
1、建立socket
2、bind(命名IP地址和埠號)
3、listen(建立監聽佇列)
4、accept(拿到已經完成連線的)
5、recv/send(收發資料)
6、close(關閉)

客戶端:
1、socket
2、connect
3、recv/send
4、close

①建立套接字函式:int socket(int domain, int type, int protocol)
domain:協議簇 IPv4(AF_INET)或 IPv6(AF_INET6) 
type:選擇協議 TCP:SOCK_STREAM     UDP:SOCK_DGRAM   
protocol:0  

②命名IP地址和埠號:int bind(int sockfd,const struct sockaddr*addr,int addrlen)
sockfd:檔案描述符 
addr:指定IP地址和埠號   
struct sockaddr_in
{  
    sa_family_t sin_family;   //地址簇:AF_INET
    u_int16_t sin_port;       //埠號(網路位元組序:大端模式 PC機:小端模式)
    struct in_addr sin_addr; //IPv4地址結構體
};  
struct sin_addr
{  
       u_int32_t s_addr;        //IPv4地址用網路位元組序表示
};  
addrlen:該socket地址的長度

③建立一個監聽佇列:int listen(int sockfd, int size) 
size:佇列大小,預設值5 。

④int accept(int sockfd,struct sockaddr *addr ,int *addrlen)
addr:要連線的伺服器的ip地址及埠號(netstat -atp 顯示本機上所有的tcp服務程式以及其佔用的埠號)

⑤recv(c,buff,127,0)

程式碼實現
ser.c

 void main()
 {
     int sockfd = socket(AF_INET,SOCK_STREAM,0);
     assert(sockfd != -1);

     struct sockaddr_in ser,cli;
     ser.sin_family = AF_INET;
     ser.sin_port = htons(6000);
     ser.sin_addr.s_addr = inet_addr("127.0.0.1");

      int res = bind(sockfd,(struct sockaddr*)&ser,sizeof(ser));
      assert(res != -1);

      listen(sockfd,5);

      while(1)
      {
          int len = sizeof(cli);
          int c = accept(sockfd,(struct sockaddr*)&cli,&len);
          assert(c != -1);

          char buff[128] = {0};
          recv(c,buff,127,0);
          printf("recv::%s\n",buff);
          send(c,"I Know",strlen("I Know"),0);

          close(c);
      }
      close(sockfd);
  }

cli.c

//客戶端cli.c
void main()
 {
     int sockfd = socket(AF_INET,SOCK_STREAN,0);
      assert(sockfd != -1);

      struct sockaddr_in ser,cli;
      ser.sin_family = AF_INET;
     ser.sin_port = htons(6000);
      ser.sin_addr.s_addr = inet_addr("127.0.0.1");

      int res = connect(sockfd,(struct sockaddr*)&ser,sizeof(ser));
      assert(res != -1);

      send(sockfd,"Hello World",strlen("Hello World"),0);
      char buff[128] = {0};
      recv(sockfd,buff,127,0);

      printf("recv::%s\n",buff);

      close(sockfd);
  }

相關推薦

TCP介紹TCP網路程式設計

一、TCP頭部結構: ①16位埠號及16位目的埠號:告知主機該報文段來自哪裡(源埠)要傳給那個上層協議或應用程式(目的埠)。 ②32位序號:一次TCP通訊過程中某一個傳輸方向上的位元組流的每個位元組的編號。A傳送給B的第一個報文段中,序號值被系統初始化為

TCP、UDP、網路程式設計

1、TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下: (1)TCP服務端程式設計的一般步驟為: 呼叫socket函式,建立一個套接字描述符。 建立網路地址結構,指定要監聽的IP和埠號。 呼叫bind函式,將套接字描述符與網路地址結構繫結

基於tcp/ip協議的網路程式設計的一點感悟 ---關於ip和port作為通訊一端的唯一標識的認識

      對於基於tcp的應用程式來說,無論是客戶端,還是伺服器端,唯一標識對端id的是socket pair {本地ip:本地port, 遠端ip:遠端port} ,底層的ip協議資料包肯定包含源ip和port,目的ip和port, 當此資料包到達目的地時,目標主機的tc

TCP客戶端/伺服器網路程式設計------多程序併發模型(附帶實現)

多程序併發模型相比同步阻塞迭代模型,多程序併發模型可以避免是程式阻塞在read系統呼叫上。如果沒有客戶端來建立連線,則會阻塞在accept處。一旦某個客戶端連線建立起來,則立即開啟一個新的程序來處理與這個客戶的資料互動。避免程式阻塞在read呼叫,而影響其他客戶端的連線。缺陷

python 協程socket網路程式設計

協程 什麼是協程 協程,英文Coroutines,是一種比執行緒更加輕量級的存在。正如一個程序可以擁有多個執行緒一樣,一個執行緒也可以擁有多個協程。 最重要的是,協程不是被作業系統核心所管理,而完全是由程式所控制(也就是在使用者態執行)。 這樣帶來的好處就是效能得到了很大的提升,不會

Unix 網路程式設計(四)- 典型TCP客服伺服器程式開發例項基本套接字API介紹

寫在開頭: 在上一節中我們學習了一些基礎的用來支援網路程式設計的API,包括“套接字的地址結構”、“位元組排序函式”等。這些API幾乎是所有的網路程式設計中都會使用的一些,對於我們正確的編寫網路程式有很大的作用。在本節中我們會介紹編寫一個基於TCP的套接字程式需要的一些AP

Linux網路程式設計TCP客戶/伺服器模型基本socket函式

TCP客戶/伺服器模型 TCP連線的分組交換 在使用socket API的時候應該清楚應用程式和TCP協議棧是如何互動的: 呼叫connect()會發出SYN段(SYN是TCP報文段頭部的一個標誌位,置為1) 阻塞的read()函式返回0就表明收到了FIN段 客戶端呼叫c

聊聊Socket、TCP/IP、HTTP、FTP網路程式設計

1 這些都是什麼 既然是網路傳輸,涉及幾個系統之間的互動,那麼首先要考慮的是如何準確的定位到網路上的一臺或幾臺主機,另一個是如何進行可靠高效 的資料傳輸。這裡就要使用到TCP/IP協議。 1.1 TCP/IP協議組 TCP/IP協議(傳輸控制協議)

linux網路程式設計TCP狀態轉換埠複用

(1)TCP狀態轉換圖               其中圖中分為三種狀態:實線代表的主動發起連線,虛線代表的被動發起連線,細實線代表的可以雙向發起連線的狀態。 主動發起連線方狀態變化:1)主動發起連線的一方傳送SYN標誌位,進入SYN_SENT狀態,等待接收被髮起連線方

嵌入式Linux網路程式設計網路基礎,OSI七層模型,TCP/IP四層模型,TCP/IP通訊模型、協議結構、封包與拆包,TCP/UDP協議特點適用情況

文章目錄 1,TCP協議分成了兩個不同的協議----->TCP/IP協議誕生 2,網路的體系結構 2.1,OSI開放系統互聯模型 2.2,TCP/IP協議族的體系結構 3,TCP/IP協議通訊模型 3.1

python day31--網路程式設計,tcp,udp的指令,黏包

一、TCP tcp中遇到黏包會讓資料傳輸完。 server import socket sk=socket.socket() sk.bind(('127.0.0.1',8090)) sk.listen() while True: cmd=input('>>>')

vc 網路程式設計(socket)TCP/UDP 介紹

在網上找了很多的資料,現將這些資料整合起來,詳細介紹一下VC下的socket程式設計,並提供一個伺服器客戶端具體的例項。希望對您有所幫助 一、原理部分    在網路程式設計中最常用的方案便是Client/Server (客戶機/伺服器)模型。在這種方案中客戶應用程式向伺服器

TCP網路程式設計介面詳細介紹

1.socket介面(用來建立網路套接字):         int socket(int family, int type, int protocol);         引數:family 指明協議族(IPv4:AF_INET)(IPv6:AF_INET6)      

Socket、TCP/IP、HTTP、FTP網路程式設計

套接字(socket)概念:套接字(socket)是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元。它是網路通訊過程中端點的抽象表示,包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。應用層通過傳輸層進行資料通訊時,TCP會

c++網路程式設計2:TCP連線概念程式設計

一.TCP建立連線的三次握手 在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線。 第一次握手:建立連線時,客戶端傳送SYN包(SYN=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;【客戶端->服務端:SYN(j)】 第二次握手

高效能網路程式設計總結TCP/IP Sockets程式設計(C語言實現) (第2版)》 程式碼下載(連結以及檔案打包)

這篇文章將試圖說明應用程式如何接收網路上傳送過來的TCP訊息流,由於篇幅所限,暫時忽略ACK報文的回覆和接收視窗的滑動。 為了快速掌握本文所要表達的思想,我們可以帶著以下問題閱讀: 1、應用程式呼叫read、recv等方法時,socket套接字可以設定為阻塞或者非阻塞,這兩種方式是如何工作的? 2、

tcp網路程式設計客戶端和服務端listen和tcp允許最大連線數

tcp網路程式設計 tcp網路程式設計步驟: 由於tcp傳輸特點是可靠有連線,那麼就有 1.客戶端向服務端傳送連線請求(SYN), 2.服務端接受請求並向客戶端傳送(SYN+ACK); 3.客戶端向服務端回覆ACK表明他知道服務端同意連線。 以上三個步驟就是三次

雲計算介紹TCP/IP協議配置

ip路由 適配 res 集合 add 要素 其他 1.2 網絡 典型服務模式? C/S,Client/Server架構– 由服務器提供資源或某種功能– 客戶機使用資源或功能 ##################################################

雲計算介紹TCP/IP協議配置

適配器 背景 關閉window 操作系統 cli 通信協議 本地連接 一個 地址 真機Linux操作系統,用戶賬戶 root 密碼 Taren1 虛擬系統管理器(軟件):虛擬計算機的硬件 典型服務模式? C/S,Client/Server架構– 由服務器提供資源或某種功

GO語言使用之網路程式設計(TCP程式設計)

一、基本介紹 Golang的主要設計目標之一就是面向大規模後端服務程式,網路通訊這塊是服務端 程式必不可少也是至關重要的一部分。 1、 網路程式設計有兩種: 1) TCP socket程式設計,是網路程式設計的主流。之所以叫Tcp socket程式設計,是因為底層是基於Tcp/i