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。當伺服器收到客戶端的確認報文之後...