傳輸層TCP協議 TCP伺服器 客戶端

2021-06-29 02:25:01 字數 3149 閱讀 3973

tcp伺服器端/客戶端流程

由socket函式建立,隨後用做bind,listen函式的第乙個引數的描述符。乙個伺服器通常僅僅建立乙個監聽套接字,它在該伺服器的生命期內一直存在。

由accept函式返回。核心為每個由伺服器程序接受的客戶連線建立乙個已連線套接字(tcp三路握手過程已完成),當伺服器完成對某個給定客戶的服務時,相應的已連線套接字就被關閉。

兩個客戶的tcp客戶/伺服器:

伺服器主機上有兩個已連線套接字,其中每乙個都有各自的套接字接收緩衝區。

乙個回射併發伺服器執行如下步驟:

(1)客戶從標準輸入讀入一行文字,並寫給伺服器;

(2)伺服器從網路輸入讀入這行文字,並回射給客戶;

(3)客戶從網路輸入讀入這行回射文字,並顯示在標準輸出上。

tcp回射併發伺服器端流程

signal(sigchld, sig_chld); //必須呼叫waitpid()

for(;;)

printf("connection from client ip: %s, prot: %d \n", inet_ntoa(cliaddr.sin_addr), htons(cliaddr.sin_port));

//fork為每個客戶派生乙個處理它們的子程序

if((childpid = fork()) == 0)

//父程序關閉已連線套接字

close(connfd);

} }void sig_chld(int signo)

// str_echo函式執行處理每個客戶的服務:從客戶讀入資料,並回射給客戶

void str_echo(int sockfd)

//客戶關閉連線,接收到客戶的fin將導致伺服器子程序的read函式返回0,str_echo函式返回,子程序終止

}tcp客戶端流程客戶建立5個與伺服器的連線

//建立多個連線的目的是從併發伺服器上派生多個子程序

for(i = 0; i<5;i++)

bzero(&servaddr,sizeof(servaddr));

//用伺服器的ip位址和埠號裝填乙個網際網套接字位址結構

servaddr.sin_family= af_inet;

servaddr.sin_port = htons(9877);

inet_pton(af_inet, argv[1], &servaddr.sin_addr) ;

if(connect(sockfd,(struct sockaddr *)& servaddr,sizeof(servaddr))==-1)

}//呼叫str_cli函式時僅用第乙個連線

str_cli(stdin, sockfd[0]);

exit(0);

}//str_cli函式完成客戶處理迴圈:從標準輸入讀入一行文字,寫到伺服器,讀回伺服器對該行的回射,並把回射行寫到標準輸出上。

void str_cli(file *fp, int sockfd)

write(fileno(stdout), buf, n);

} if (fd_isset(fileno(fp), &rset))

writen(sockfd, buf, n);

} }

}當客戶終止時,所有開啟的描述符由核心自動關閉(僅需呼叫exit),且所有5個連線基本在同一時刻終止,這就引發5個fin,反過來使伺服器的5個子程序基本在同一時刻終止,導致差不多在同一時刻有5個sigchld訊號傳遞給父程序。

tcp伺服器/客戶端邊界條件

1) accept返回前連線終止

三路握手完成,連線建立。

客戶端:tcp傳送乙個rst(復位)

伺服器:連線已由tcp排隊,伺服器程序呼叫accept之前rst到達

svr4實現返回乙個eproto(protocol error,協議錯誤)errno值

posix實現返回乙個econnaborted (software caused connection abort )errno值

伺服器忽略錯誤,並再次呼叫accept

2) 拒絕服務型攻擊

當乙個伺服器在處理多個客戶時,它絕對不能阻塞於只與單個客戶相關的某個函式呼叫。否則可能導致伺服器被掛起,拒絕為所有其他客戶提供服務。即所謂拒絕服務(denial of service)型攻擊。

可解決辦法包括:

傳輸層 TCP協議

1 序號 在乙個tcp連線中傳送的位元組流中的每乙個位元組都按順序編號,本欄位表示本報文段所傳送資料的第乙個位元組的序號。2 確認號 期望收到對方下乙個報文段的第乙個資料位元組的序號。若確認號為n,則證明到序號n 1為止的所有資料都已正確收到。即採用累計確認 3 資料偏移 首部長度 tcp 報文段的...

傳輸層TCP協議

面向連線,可靠傳輸,面向位元組流 tcp協議 面向連線 accept 獲取新連線 1.當呼叫accept之後,核心就會為新連線建立乙個套接字描述符,服務端使用該套接字描述符進行和客戶端進行資料通訊 2.連線建立之後,雙方都可以傳送資料 確認msg1 確認的行為是傳輸層tcp協議的行為,不是應用層的行...

傳輸層協議TCP

部分埠號 第二次握手 伺服器應用程序被動開啟。若同意客戶端的請求,則發回確認報文,其首部中 syn 1,ack 1,ack x 1,seq y。第三次握手 客戶端收到確認報文之後,通知上層應用程序連線已建立,並向伺服器發出確認報文,其首部 ack 1,ack y 1。當伺服器收到客戶端的確認報文之後...