TCP IP協議學習總結

2021-06-20 14:43:16 字數 4131 閱讀 4953

本文為自己的學習總結,沒有那些大神們那麼的深入,只為自己的一些心得總結,有很多不足之處,請各位勿噴,望多多指正!!無限感激

一、tcp/ip協議

為什麼會有這個協議: 為了實現不同計算機系統/網路系統之間的通訊其他還有很多網路協議,只是很多只能特定某些計算機系統間的通訊,通用性不強

tcp/ip協議是什麼: ip協議: 實現不同網路的互聯; tcp: 用於傳輸控制協議

tcp/ip協議的體系結構: 主要有四個層次:應用層(我們的資料)、傳輸層(tcp/udp,實現傳輸資料)、網路層(ip層,實現不同網路之間的鏈結,包括如何

找到目標機器)、網路介面和物理層(實現真正的資料傳送)。

接下來深入理解這幾個協議:

實現網路互聯的協議(ip協議): 最主要的就是通過ip位址找到目標機器。ip位址有四類(a、b、c、d)

a類:  1.0.0.1 ~ 127.255.255.255

b類:  128.0.0.1 ~ 191.255.55.255

c類:  192.0.0.1 ~ 223.255.255.255

d類:  224.0.0.1~ 239.255.255.255 (用於組播)

實現資料傳播的協議:

tcp協議(傳輸控制協議): 必須先建立連線然後才能通訊(相當於打**,必須得到應答只有才能通訊,而且有資料檢驗),可靠性高。

udp協議(資料報文傳輸協議): 不可靠無連線傳輸(只管傳送出去,相當於寫信,對方收不收到都不管),傳輸快,但是不可靠常用於廣播 。

二、如何進行網路程式設計(linux)

socket:程序通訊介面、網路通訊程式設計介面,不僅適用於本地程序的通訊, 還適用於網路之間程序的通訊。

面向連線的 socket機制與國家**網路有點類似:兩個**號碼相當於兩個程序socket號。**的區號相當於乙個網路位址,區內的乙個單位交換機相當於一台電腦主機,區內的每乙個**(號碼)相當於程序的socket號。使用者打**通訊前都需要有乙個號碼,也就是兩個程序通訊前要有乙個socket號。撥打**的時候相當於通過socket號進行連線,如果對方不在用乙個區域那麼就得加上區號也相當於網路位址(ip位址)。若果對方**機存在並且空閒,那麼就進行通訊,想**機發出資訊或者接收資訊,就相當於像socket發出資訊或者接收資訊。我們在通過**通訊的時候,**機是遮蔽了整個**系統裡面的東西(比如怎麼進行組網呀,怎麼進行查詢某個**機呀等等),而socket也是遮蔽了整個網際網路的細節(比如如何查詢到某個主機,如何建立連線等等),這樣的話,給應用層程式設計帶來了很多的方便之處。

socket程式設計的注意事項: ip位址的繫結、埠號的繫結、位元組序(網路位元組序為大端序)、防火牆、超時等問題

socket有三種型別,分別用於不同的協議:  

流式套接字(sock_stream): 適用於 tcp協議

資料報套接字(sock_dgram): 適用於udp協議

原始套接字(sock_ram): 可以直接訪問 ip、icmp層

網路程式設計常用介面函式:

socket(): 建立套接字

bind(): 繫結本機位址和埠

connect(): 建立連線(用於tcp客戶端)

listen(): 監聽套接字

accept(): 接受tcp連線(用於tcp伺服器)

recv()、read()、recvfrom() : 接收資料,其中recvfrome()用於udp協議

send()、write()、sendto(): 傳送資料,其中 sendto() 用於udp協議

close()、shutdown() : 關閉套接字

常用結構體:

struct sockaddr        //通用位址結構體

struct sockaddr_in      // internet 協議位址結構體

程式設計的總體思想是:尋找目標主機、尋找目標程序、通訊

tcp程式設計流程:  

例子:伺服器端

#include "head_net.h"

int main(int argc,char **argv)

/*1:建立socket*/

if( (sock_fd = socket(af_inet,sock_stream,0)) < 0) 

p_error("socket");

/*2:繫結位址*/

bzero(&sin,sizeof(sin));

sin.sin_family = af_inet;

sin.sin_port = htons(port);

sin.sin_addr.s_addr = inet_addr(srv_ip);

if(bind(sock_fd,(struct sockaddr*)&sin,sizeof(sin)) < 0)

p_error("bind");

/*3:監聽*/

if(listen(sock_fd,n) < 0)

p_error("listen");

/*4:連線,三次握手*/

if( (conn_fd = accept(sock_fd,(struct sockaddr*)&cin,&len))<0)

p_error("accept");

/*5:通訊*/

while(1)

if(strncmp(buf,"quit",4) == 0)

break;

printf("%s",,buf);

}    

/*6:關閉socket*/

shutdown(conn_fd,0);

return 0; }

客戶端:

#include "head_net.h"

int main(int argc,char **argv)

if( (sock_fd = socket(af_inet,sock_dgram,0)) < 0)

p_error("socket");

bzero(&sin,sizeof(sin));

sin.sin_family = af_inet;

sin.sin_port = htons(port);

sin.sin_addr.s_addr = inet_addr(argv[1]);

while(1)

close(sock_fd);

return 0; }

udp程式設計流程:

例子:伺服器

#include "head_net.h"

int main(int argc,char **argv)

if( (sock_fd = socket(af_inet,sock_dgram,0)) < 0)

p_error("socket");

bzero(&sin,sizeof(sin));

sin.sin_family = af_inet;

sin.sin_port = htons(port);

sin.sin_addr.s_addr = inet_addr(argv[1]);

if(bind(sock_fd,(struct sockaddr*)&sin,sizeof(sin)) < 0)

p_error("bind");

len = sizeof(cin);

while(1)

close(sock_fd);

return 0; }

客戶端:

#include "head_net.h"

int main(int argc,char **argv)

if( (sock_fd = socket(af_inet,sock_dgram,0)) < 0)

p_error("socket");

bzero(&sin,sizeof(sin));

sin.sin_family = af_inet;

sin.sin_port = htons(port);

sin.sin_addr.s_addr = inet_addr(argv[1]);

while(1)

close(sock_fd);

return 0; }

TCP IP學習與總結 3 TCP IP 協議

tcp ip是不同通訊協議的大集合。1 tcp 傳輸控制協議 tcp用於從應用程式到網路的資料傳輸控制。tcp 負責在資料傳送之前將它們分割為 ip 包,然後在它們到達的時候將它們重組。2 ip 網際協議 ip負責計算機之間的通訊。ip 負責在網際網路上傳送和接收資料報。3 http 超文字傳輸協議...

TCP IP協議學習

tcp ip參考模型 是乙個抽象的分層模型,這個模型中,所有的 tcp ip 系列網路協議 都被歸類到4個抽象的 層 中。每一抽象層建立在低一層提供的服務上,並且為高一層提供服務。完成一些特定的任務需要眾多的協議協同工作,這些協議分布在參考模型的不同層中的,因此有時稱它們為乙個 協議棧。最上面的是應...

TCP IP協議學習

tcp提供一種面向連線的 可靠的位元組流服務。tcp ip一般被認為是四層協議 應用層 處理特定的應用程式細節。傳輸層 主機間的應用程式提供端到端的通訊,包括tcp 傳輸控制協議 和udp 使用者資料報協議 網路層 網路層的協議包括ip協議 icmp協議 internet網際網路控制報文協議 igm...