




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
網(wǎng)絡(luò)課第四次上機實驗報告————-—TCP協(xié)議實驗實驗內(nèi)容實驗內(nèi)容主要包括:設(shè)計保存TCP連接相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)(TCB);TCP協(xié)議的接收處理和封裝發(fā)送;TCP協(xié)議提供的Socket函數(shù)接口。實驗過程設(shè)計保存TCP連接相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)(TCB)用數(shù)據(jù)結(jié)構(gòu)TCB為每一個TCP連接維護socketfd,srcAddr,dstAddr,srcPort,dstPort,seq,ack,windowSize,state這些狀態(tài)信息.以鏈表形式組織多個連接,nextTcb指向下一個連接的數(shù)據(jù)結(jié)構(gòu)。TCP分組接收函數(shù)stud_tcp_input()首先,檢查校驗和;然后通過字節(jié)序轉(zhuǎn)換獲取相應(yīng)的信息,檢查序列號。如果序列號不正確,則調(diào)用tcp_DiscardPkt;最后將報文交由輸入有限狀態(tài)機處理,有限狀態(tài)機對報文進行處理,轉(zhuǎn)換狀態(tài)。根據(jù)當(dāng)前的狀態(tài)并調(diào)用stud_tcp_output函數(shù)完成tcp建連、數(shù)據(jù)傳遞時返回ACK、tcp斷連等工作TCP分組發(fā)送函數(shù)stud_tcp_output()判斷需要發(fā)送的報文類型,根據(jù)報的類型對包中的相應(yīng)字段進行設(shè)置,判斷是否可以發(fā)送(發(fā)送窗口不為0)。構(gòu)造TCP數(shù)據(jù)報文并發(fā)送。填寫TCP報文各字段的內(nèi)容和數(shù)據(jù),轉(zhuǎn)換字節(jié)序,計算校驗和,然后調(diào)用發(fā)送流程的下層接口函數(shù)sendIpPkt()發(fā)送.stud_tcp_socket()函數(shù)分配相應(yīng)的socketfd并且新建TCB表項,并對成員變量進行初始化stud_tcp_connect()函數(shù)設(shè)定目的IPv4地址和端口,源IPv4地址和端口;初始化TCB結(jié)構(gòu)中的相關(guān)變量;設(shè)定TCB中的輸入狀態(tài)為SYN-SENT,及其它相關(guān)變量,準(zhǔn)備發(fā)送SYN報文;調(diào)用發(fā)送流程的下層接口函數(shù)stud_tcp_output()發(fā)送SYN報文(發(fā)送類型為PACKET_TYPE_SYN);等待“三次握手"完成后返回,建立連接成功;或者出錯返回。stud_tcp_send()函數(shù)判斷是否處于ESTABLISHED狀態(tài);將應(yīng)用層協(xié)議的數(shù)據(jù)拷貝到TCB的輸入緩沖區(qū);調(diào)用stud_tcp_output()發(fā)送TCP的數(shù)據(jù)報文(發(fā)送類型為PACKET_TYPE_DATA);同時等待ACK以實現(xiàn)停等式協(xié)議stud_tcp_recv()函數(shù)判斷是否處于ESTABLISHED狀態(tài);從TCB的輸入緩沖區(qū)讀出數(shù)據(jù);將數(shù)據(jù)交給應(yīng)用層協(xié)議。stud_tcp_close()函數(shù)在正常情況下(ESTABLISHED狀態(tài)),進行相應(yīng)狀態(tài)轉(zhuǎn)換,非正常情況下(SYN-SENT狀態(tài)),直接刪除TCB結(jié)構(gòu)后退出;調(diào)用發(fā)送流程下層接口函數(shù)stud_tcp_output()發(fā)送FIN報文(發(fā)送類型為PACKET_TYPE_FIN);等待回應(yīng)的ACK報文,收到后成功返回,或者出錯返回;刪除相應(yīng)的TCB表項.實驗總結(jié)通過本次實驗,加深了對TCP協(xié)議的原理和設(shè)計實現(xiàn)的機制的了解,對TCP協(xié)議有了更具體的認(rèn)識,對概論課的學(xué)習(xí)有很大的幫助!附:上機代碼(注釋)#include”sysInclude.h"externvoidtcp_DiscardPkt(char*pBuffer,inttype);externvoidtcp_sendReport(inttype);externvoidtcp_sendIpPkt(unsignedchar*pData,UINT16len,unsignedintsrcAddr,unsignedintdstAddr,UINT8 ttl);externintwaitIpPacket(char*pBuffer,inttimeout);externunsignedintgetIpv4Address();externunsignedintgetServerIpv4Address();#defineBUFFER_SIZE1024#defineTIMEOUT5enumstatus{CLOSED,SYN_SENT,ESTABLISHED,FIN_WAIT_1,FIN_WAIT_2,TIME_WAIT};//狀態(tài)intgSrcPort=2007;intgDstPort=2006;intgSeqNum=1;intgAckNum=0;structTCB{ intsocketfd; UINT32srcAddr;?UINT32dstAddr; UINT16srcPort;?UINT16dstPort; UINT32seq; UINT32ack;?UINT16windowSize; UINT8state;?TCB*nextTcb;?TCB(){//用于TCP報文接收發(fā)送流程?socketfd=0; srcAddr=getIpv4Address();?dstAddr=getServerIpv4Address(); srcPort=gSrcPort;?dstPort=gDstPort; seq=gSeqNum;?ack=gAckNum;?windowSize=1; state=CLOSED; nextTcb=NULL;?}?TCB(intfd){//用于客戶端socket函數(shù)的構(gòu)建函數(shù) socketfd=fd;?seq=gSeqNum; ack=gAckNum;?windowSize=1;?state=CLOSED;?nextTcb=NULL; }};UINT16CalcChecksum(char*pBuffer,intlen,UINT32srcAddr,UINT32dstAddr){ inttcp_len=len+12;?UINT32checkSum=0;?if(tcp_len&0x1==1)tcp_len+=1;?char*buffer=newchar[tcp_len]; memset(buffer,0,tcp_len); memcpy(buffer+12,pBuffer,len);?*((UINT32*)buffer)=htonl(srcAddr);?*((UINT32*)(buffer+4))=htonl(dstAddr);?buffer[9]=6; //傳輸層協(xié)議號?*((UINT16*)(buffer+10))=htons(len); for(inti=0;i〈tcp_len;i+=2){?checkSum+=*((UINT16*)(buffer+i)); }?checkSum=(checkSum&0xFFFF)+(checkSum〉>16); checkSum=~checkSum; returncheckSum;}TCB*tcbLinkTable=NULL;//TCB鏈表/*通過兩端的IP地址和端口號尋找TCB表項*/TCB*findTCB(UINT32srcAddr,UINT16srcPort,UINT32dstAddr,UINT16dstPort){ TCB*tcb=tcbLinkTable; while(tcb!=NULL){ if((tcb—>srcAddr==srcAddr)&&(tcb—〉srcPort==srcPort)&&(tcb—>dstAddr==dstAddr)&&(tcb—>dstPort==dstPort)) returntcb; tcb=tcb-〉nextTcb;?} returnNULL;}intstud_tcp_input(char*pB(yǎng)uffer,unsignedshortlen,unsignedintsrcAddr,unsignedintdstAddr){ /*檢查校驗和*/?if(CalcChecksum(pBuffer,len,ntohl(srcAddr),ntohl(dstAddr))?。?) return—1;?UINT16srcPort=ntohs(*(UINT16*)pB(yǎng)uffer);?UINT16dstPort=ntohs(*(UINT16*)(pB(yǎng)uffer+2));?UINT32seq=ntohl(*((UINT32*)(pBuffer+4))); UINT32ack=ntohl(*((UINT32*)(pB(yǎng)uffer+8)));?UINT8flags=(pBuffer[13]&0x13);?TCB*tcb=findTCB(ntohl(dstAddr),dstPort,ntohl(srcAddr),srcPort);?if(tcb==NULL){?return-1;?}?if(ack!=tcb—〉seq+1){ tcp_DiscardPkt(pB(yǎng)uffer,STUD_TCP_TEST_SEQNO_ERROR); return—1;?}?/*有限狀態(tài)機轉(zhuǎn)換*/?if((tcb—>stat(yī)e==SYN_SENT)&&(flags==0x12)){ tcb—>seq=ack;?tcb->ack=seq+1;?stud_tcp_output(NULL,0,PACKET_TYPE_ACK,tcb—>srcPort,tcb—>dstPort,tcb—〉srcAddr,tcb—〉dstAddr);?tcb—〉state=ESTABLISHED;?}elseif((tcb->state==FIN_WAIT_1)&&(flags==0x10)){?tcb—>state=FIN_WAIT_2; }elseif((tcb->state==FIN_WAIT_2)&&(flags==0x11)){?tcb—〉ack=seq+1; tcb-〉seq=ack;?tcb->state=TIME_WAIT;?stud_tcp_output(NULL,0,PACKET_TYPE_ACK,tcb—〉srcPort,tcb—>dstPort,tcb—>srcAddr,tcb-〉dstAddr);?tcb-〉state=CLOSED;?}?return0;}voidstud_tcp_output(char*pDat(yī)a,unsignedshortlen,unsignedcharflag,unsignedshortsrcPort,unsignedshortdstPort,unsignedintsrcAddr,unsignedintdstAddr){ TCB*tcb=findTCB(srcAddr,srcPort,dstAddr,dstPort);//尋找TCB項?if(tcbLinkTable==NULL)//用于TCP報文接收發(fā)送流程{?tcb=newTCB(); tcbLinkTable=tcb; } if(tcb==NULL||tcb->windowSize==0)return; /*構(gòu)造新的發(fā)送報文*/?unsignedchar*packet=newunsignedchar[len+20]; memset(packet,0,len+20);?memcpy(packet+20,pData,len);?*(UINT16*)(packet)=htons(tcb->srcPort);?*(UINT16*)(packet+2)=htons(tcb-〉dstPort);?*(UINT32*)(packet+4)=htonl(tcb-〉seq);?*((UINT32*)(packet+8))=htonl(tcb-〉ack);?packet[12]=20〈<2; switch(flag)?{ casePACKET_TYPE_SYN:?packet[13]=0x02; tcb-〉state=SYN_SENT;?//發(fā)送SYN報文,狀態(tài)轉(zhuǎn)移為SYN_SENT break;?casePACKET_TYPE_ACK:?packet[13]=0x10;?break;?casePACKET_TYPE_SYN_ACK:?packet[13]=0x12;?break; casePACKET_TYPE_FIN: packet[13]=0x01; break; casePACKET_TYPE_FIN_ACK:?packet[13]=0x11;?tcb->state=FIN_WAIT_1;?break; casePACKET_TYPE_DATA: break; }?*((UINT16*)(packet+14))=htons(tcb->windowSize);?*((UINT16*)(packet+16))=CalcChecksum((char*)packet,len+20,srcAddr,dstAddr); tcp_sendIpPkt(packet,len+20,tcb—〉srcAddr,tcb—>dstAddr,255); return;}intstud_tcp_socket(intdomain,inttype,intprotocol){ staticint?socketfd=1;?TCB*tcb=newTCB(socketfd++);?tcb—〉nextTcb=tcbLinkTable;?tcbLinkTable=tcb;?returntcb->socketfd;}intstud_tcp_connect(intsockfd,structsockaddr_in*addr,intaddrlen){?charbuffer[BUFFER_SIZE];?TCB*tcbPointer=tcbLinkTable;?while((tcbPointer!=NULL)&&(tcbPointer—>socketfd!=sockfd))tcbPointer=tcbPointer—>nextTcb; TCB*tcb=tcbPointer;//找到TCB相應(yīng)表項?if(tcb==NULL)return-1; /*初始化源和目的的地址及端口號*/?tcb—〉srcAddr=getIpv4Address(); tcb—>srcPort=gSrcPort; tcb->dstAddr=ntohl(addr—>sin_addr。s_addr);?tcb—>dstPort=ntohs(addr-〉sin_port); /*建立連接:發(fā)送SYN報文*/ stud_tcp_output(NULL,0,PACKET_TYPE_SYN,tcb->srcPort,tcb->dstPort,tcb->srcAddr,tcb->dstAddr);?/*接收SYN_ACK報文*/ if(waitIpPacket(buffer,TIMEOUT)==—1||(buffer[13]&0x13)!=0x12)return—1;?tcb—>seq=ntohl(*((UINT32*)(buffer+8)));?tcb->ack=ntohl(*((UINT32*)(buffer+4)))+1; /*發(fā)送ACK報文,建立連接完成*/ stud_tcp_output(NULL,0,PACKET_TYPE_ACK,tcb-〉srcPort,tcb-〉dstPort,tcb->srcAddr,tcb—〉dstAddr); tcb-〉state=ESTABLISHED; return0;}intstud_tcp_send(intsockfd,constunsignedchar*pData,unsignedshortdatalen,intflags){ charbuffer[BUFFER_SIZE]; TCB*tcbPointer=tcbLinkTable; while((tcbPointer!=NULL)&&(tcbPointer->socketfd!=sockfd))tcbPointer=tcbPointer-〉nextTcb;?TCB*tcb=tcbPointer;//找到TCB相應(yīng)表項 if(tcb==NULL||tcb—〉state!=ESTABLISHED)return—1;?/*發(fā)送DATA報文*/ stud_tcp_output((char*)pDat(yī)a,datalen,PACKET_TYPE_DATA,tcb-〉srcPort,tcb->dstPort,tcb->srcAddr,tcb—〉dstAddr); /*等待接收ACK*/ if(waitIpPacket(buffer,TIMEOUT)==-1)return-1;?if((buffer[13]&0x13)!=0x10)return—1; tcb-〉seq=ntohl(*((UINT32*)(buffer+8))); tcb-〉ack=ntohl(*((UINT32*)(buffer+4)))+1; return0;}intstud_tcp_recv(intsockfd,unsignedchar*pDat(yī)a,unsignedshortdatalen,intflags){ charbuffer[BUFFER_SIZE];?intlen=0; TCB*tcbPointer=tcbLinkTable;?while((tcbPointer!=NULL)&&(tcbPointer—>socketfd!=sockfd))tcbPointer=tcbPointer-〉nextTcb; TCB*tcb=tcbPointer; if(tcb==NULL||tcb->state!=ESTABLISHED)return-1;?/*等待接收數(shù)據(jù)*/?if((len=waitIpPacket(buffer,TIMEOUT))==—1)return—1; intheader_length=(buffer[12]>〉2)&0x3C; memcpy(pData,buffer+header_length,len-h(huán)eader_length); tcb—>seq=ntohl(*((UINT32*)(buffer+8)));?tcb—〉ack=ntohl(*((UINT32*)(buffer+4)))+(len—header_length); stud_tcp_output(NULL,0,PACKET_TYPE_ACK,tcb-〉srcPort,tcb—〉dstPort,tcb-〉srcAddr,tcb->dstAddr); return0;}intstud_tcp_close(intsockfd){?charbuffer[BUFFER_SIZE];?TCB*pre=NULL;TCB*tcb=tcbLinkTable;?while((tcb!=NULL)&&(tcb-〉socketfd!=sockfd)){?pre=tcb; tcb=tcb—〉nextTcb; }?if(tcb==NULL)return-1;?if(tcb->state!=ESTABLISHED){?if(pre!=NUL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)村房屋開荒合同范本
- 中醫(yī)診所合同范本
- Unit4 What's the best movie theater Section B1a-1e(教學(xué)設(shè)計)-2024-2025學(xué)年人家新目標(biāo)八年級英語上冊
- 第6課 全球航路的開辟 教學(xué)設(shè)計-2023-2024學(xué)年高一統(tǒng)編版2019必修中外歷史綱要下冊
- 農(nóng)村遺產(chǎn)糾紛合同范本
- 專題講座合同范本
- 代賣人合同范本
- 買賣正規(guī)合同范本
- 2024年眉山市仁壽縣中醫(yī)醫(yī)院招聘護理人員考試真題
- 買方外貿(mào)合同范例
- 美術(shù)基礎(chǔ)試題庫含答案
- 2024年4月自考05424現(xiàn)代設(shè)計史試題
- 2023版馬原專題課件:專題一馬克思主義觀;專題二辯證唯物主義世界觀
- 鄉(xiāng)村研學(xué)旅行方案
- 《養(yǎng)老機構(gòu)認(rèn)知障礙照護專區(qū)設(shè)置與服務(wù)規(guī)范》
- 貨幣流通的形式和層次課件
- DLT 5630-2021 輸變電工程防災(zāi)減災(zāi)設(shè)計規(guī)程-PDF解密
- 輸電線路安全施工培訓(xùn)
- 梅毒螺旋體抗體膠體金法檢測試劑條生產(chǎn)工藝的優(yōu)化
- 降低非計劃性拔管的發(fā)生率課件
- 2024年湖南中職學(xué)校語文普測備考試題庫(濃縮500題)
評論
0/150
提交評論