TCP网络通信
? ? TCP的上一層是應(yīng)用層,TCP向應(yīng)用層提供可靠的面向?qū)ο蟮臄?shù)據(jù)流傳輸服務(wù),TCP數(shù)據(jù)傳輸實(shí)現(xiàn)了從一個(gè)應(yīng)用程序到另一個(gè)應(yīng)用程序的數(shù)據(jù)傳遞。它能提供高可靠性通信(即數(shù)據(jù)無誤、數(shù)據(jù)無丟失、數(shù)據(jù)無失序、數(shù)據(jù)無重復(fù)到達(dá)的通信。),應(yīng)用程序通過向TCP層提交數(shù)據(jù)接發(fā)送/收端的地址和端口號(hào)而實(shí)現(xiàn)應(yīng)用層的數(shù)據(jù)通信。
通過IP的源/目的可以惟一地區(qū)分網(wǎng)絡(luò)中兩個(gè)設(shè)備的連接,通過socket的源/目的可以惟一地區(qū)分網(wǎng)絡(luò)中兩個(gè)應(yīng)用程序的連接。
三次握手:
? ? TCP是面向連接的,所謂面向連接,就是當(dāng)計(jì)算機(jī)雙方通信時(shí)必需先建立連接,然后進(jìn)行數(shù)據(jù)通信,最后拆除連接三個(gè)過程。TCP在建立連接時(shí)又分三步走:
第一步(A->B):主機(jī)A向主機(jī)B發(fā)送一個(gè)包含SYN即同步(Synchronize)標(biāo)志的TCP報(bào)文,SYN同步報(bào)文會(huì)指明客戶端使用的端口以及TCP連接的初始序號(hào);
第二步(B->A):主機(jī)B在收到客戶端的SYN報(bào)文后,將返回一個(gè)SYN+ACK的報(bào)文,表示主機(jī)B的請(qǐng)求被接受,同時(shí)TCP序號(hào)被加一,ACK即確認(rèn)(Acknowledgement)。
第三步(A->B):主機(jī)A也返回一個(gè)確認(rèn)報(bào)文ACK給服務(wù)器端,同樣TCP序列號(hào)被加一,到此一個(gè)TCP連接完成
TCP/IP核心協(xié)議
三次握手
?
UDP
UDP即用戶數(shù)據(jù)報(bào)協(xié)議,是一種面向無連接的不可靠傳輸協(xié)議,不需要通過3次握手來建立一個(gè)連接,同時(shí),一個(gè)UDP應(yīng)用可同時(shí)作為應(yīng)用的客戶或服務(wù)器方。
由于UDP協(xié)議并不需要建立一個(gè)明確的連接,因此建立UDP應(yīng)用要比建立TCP應(yīng)用簡單得多。UDP比TCP協(xié)議更為高效,也能更好地解決實(shí)時(shí)性的問題,如今,包括網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都使用UDP協(xié)議。
TCP/IP核心協(xié)議
協(xié)議選擇
協(xié)議的選擇應(yīng)該考慮到數(shù)據(jù)可靠性、應(yīng)用的實(shí)時(shí)性和網(wǎng)絡(luò)的可靠性。
對(duì)數(shù)據(jù)可靠性要求高的應(yīng)用需選擇TCP協(xié)議,而對(duì)數(shù)據(jù)的可靠性要求不那么高的應(yīng)用可選擇UDP傳送。
TCP協(xié)議中的3次握手、重傳確認(rèn)等手段可以保證數(shù)據(jù)傳輸?shù)目煽啃?#xff0c;但使用TCP協(xié)議會(huì)有較大的時(shí)延,因此不適合對(duì)實(shí)時(shí)性要求較高的應(yīng)用;而UDP協(xié)議則有很好的實(shí)時(shí)性。
網(wǎng)絡(luò)狀況不是很好的情況下需選用TCP協(xié)議(如在廣域網(wǎng)等情況),網(wǎng)絡(luò)狀況很好的情況下選擇UDP協(xié)議可以減少網(wǎng)絡(luò)負(fù)荷。
???
Socket是一個(gè)網(wǎng)絡(luò)接口,不同的協(xié)議之間的差異性操作,則交給socket自行解決
是一種特殊的IO接口,是一種文件描述符;
是一種常用的進(jìn)程之間的通信,本地,不同主機(jī)之間通信;
Socket可用網(wǎng)絡(luò)地址結(jié)構(gòu)
{協(xié)議,本地地址,本地端口}表示
?
套接字類型:
1.流式套接字SOCK_STREAM
流式的套接字可以提供可靠的、面向連?接的通訊流。它使用了TCP協(xié)議。TCP保證了數(shù)據(jù)傳輸?shù)恼_性和順序性;
2. 數(shù)據(jù)報(bào)套接字SOCK_DGRAM
數(shù)據(jù)報(bào)套接字定義了一種無連接的服務(wù),數(shù)據(jù)通過相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無序的,并且不保證可靠,無差錯(cuò),它使用數(shù)據(jù)報(bào)協(xié)議UDP。
3. 原始套接字SOCK_RAM
原始套接字允許對(duì)低層協(xié)議如IP或ICMP直接訪問,主要用于新的網(wǎng)絡(luò)協(xié)議的測試等。
對(duì)底層協(xié)議進(jìn)行訪問,不方便,對(duì)一些協(xié)議開發(fā)。
???????????
地址結(jié)構(gòu):
struct sockaddr_in
????{
???????short int sin_family; ?/* Internet地址族 */
???????unsigned short int sin_port; ?/* 端口號(hào) */
???????struct in_addr sin_addr; ??/* IP地址 */
???????unsigned char sin_zero[8]; ?/* 填0 */
?????};
???????編程中一般并不直接針對(duì)sockaddr數(shù)據(jù)結(jié)構(gòu)操作,而是使用與sockaddr等價(jià)的sockaddr_in數(shù)據(jù)結(jié)構(gòu)
?
基于TCP/IP的服務(wù)器的流程:
1. 創(chuàng)建一個(gè)socket,用函數(shù)socket()
2. 綁定IP地址、端口等信息到socket上,用函數(shù)bind()
3.設(shè)置允許的最大連接數(shù),用函數(shù)listen()
4.接收客戶端上來的連接,用函數(shù)accept()
5.收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write()
6.關(guān)閉網(wǎng)絡(luò)連接
?
基于TCP/IP的客戶端
1.創(chuàng)建一個(gè)socket,用函數(shù)socket()
2.設(shè)置要連接的對(duì)方的IP地址和端口等屬性
3.連接服務(wù)器,用函數(shù)connect()
4.收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者
read()和write()
5.關(guān)閉網(wǎng)絡(luò)連接
總結(jié)
- 上一篇: 8086存储器编址 和 I/O编址
- 下一篇: TCP函数