A. 2018-04-23網路編程-概述-SOCKET-埠綁定-編碼解碼
計算機都遵守的網路通信協議叫做TCP/IP協議。
因為互聯網協議包含了上百種協議標准,但是最重要的兩個協議是TCP和IP協議,所以,大家把互聯網的協議簡稱TCP/IP協議。是一組協議族。完成通信的規范。
四種分類法和其中分類法:
埠號:用來標記唯一一個進程(范圍:0~65535)
為什麼不用pid?——在一個操作系統上,pid絕對不相同,而且進程pid唯一,但在不同系統上,獲取另一個系統的pid特別費勁;但是埠對應的程序是確定的,所以埠就是用來區分進程的
埠號只有整數,0~65535。能區分同一伺服器所有進程
知名埠:大家都知道的默認的埠,比如網路,0~1023
動態埠:1024~65535之間
查看埠信息的命令:netstat - an
IP地址的作用:用來標記一台電腦在網路中的數字。
同一區域網中,IP地址不能相同
網路號用來分辨不同網路,主機號用來區分不同主機
ip地址:用來在網路中標記一台電腦的一串數字,比如192.168.1.1;在本地區域網上是惟一的。
什麼是socket?
socket(簡稱 套接字 ) 是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:
它能實現不同主機間的進程間通信,我們網路上各種各樣的服務大多都是基於 Socket 來完成通信的(能完成多個電腦進程間的通信)
例如我們每天瀏覽網頁、QQ 聊天、收發 email 等等。
UDP快,不穩定
TCP慢,穩定
會變的埠號
說明:
每重新運行一次網路程序,上圖中紅圈中的數字,不一樣的原因在於,這個數字標識這個網路程序,當重新運行時,如果沒有確定到底用哪個,系統默認會隨機分配
記住一點:這個網路程序在運行的過程中,這個就唯一標識這個程序,所以如果其他電腦上的網路程序如果想要向此程序發送數據,那麼就需要向這個數字(即埠)標識的程序發送即可。
UDP綁定信息
一般服務性的程序,往往需要一個固定的埠號,這就是所謂的埠綁定
綁定的意義是使其不變 。
*一個電腦可以有多個IP地址
*單工:收音機 半雙工:對講機 全雙工:電話
UDP和TPC(網路)都是全雙工,同一時間能發能收
一般,接收方都需要綁定,發送方不需要綁定
綁定示例:
總結
一個udp網路程序,可以不綁定,此時操作系統會隨機進行分配一個埠,如果重新運行次程序埠可能會發生變化
一個udp網路程序,也可以綁定信息(ip地址,埠號),如果綁定成功,那麼操作系統用這個埠號來進行區別收到的網路數據是否是此進程的
*解包:
B. 在C#中利用Socket進行網路通信編程的一般步驟是
1.創建socket
2.確定本地計算機端點(ip和埠號)
3.socket綁定端點
4.socket.receive(); 接收數據
5.socket.send();發送數據
6.socket.close();關閉socket
C. iOS開發網路篇—Socket編程
一、網路各個協議:TCP/IP、SOCKET、HTTP等
網路七層由下往上分別為物理層、數據鏈路層、網路層、傳輸層、會話層、表示層和應用層。
其中物理層、數據鏈路層和網路層通常被稱作媒體層,是網路工程師所研究的對象;
傳輸層、會話層、表示層和應用層則被稱作主機層,是用戶所面向和關心的內容。
http協議對應於應用層
tcp協議對應於傳輸層
ip協議對應於網路層
三者本質上沒有可比性。 何況HTTP協議是基於TCP連接的。
TCP/IP是傳輸層協議,主要解決數據如何在網路中傳輸;而HTTP是應用層協議,主要解決如何包裝數據。
我 們在傳輸數據時,可以只使用傳輸層(TCP/IP),但是那樣的話,由於沒有應用層,便無法識別數據內容,如果想要使傳輸的數據有意義,則必須使用應用層 協議,應用層協議很多,有HTTP、FTP、TELNET等等,也可以自己定義應用層協議。WEB使用HTTP作傳輸層協議,以封裝HTTP文本信息,然 後使用TCP/IP做傳輸層協議將它發送到網路上。Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用介面(API),通過Socket,我們才能使用TCP/IP協議。
二、Http和Socket連接區別
相信不少初學手機聯網開發的朋友都想知道Http與Socket連接究竟有什麼區別,希望通過自己的淺顯理解能對初學者有所幫助。
2.1、TCP連接
要想明白Socket連接,先要明白TCP連接。手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網路建立TCP連接。TCP協議可以對上層網路提供介面,使上層網路數據的傳輸建立在「無差別」的網路之上。
建立起一個TCP連接需要經過「三次握手」:
第一次握手:客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握
手過程中傳送的包里不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連
接之前,TCP
連接都將被一直保持下去。斷開連接時伺服器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過「四次握手」(過程就不細寫了,就是伺服器和客
戶端交互,最終確定斷開)
2.2、HTTP連接
HTTP協議即超文本傳送協議(HypertextTransfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為「一次連接」。
1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求後,就自動釋放連接。
2)在HTTP 1.1中則可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
由
於HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種「短連接」,要保持客戶端程序的在線狀態,需要不斷地向伺服器發起連接請求。通常的
做法是即時不需要獲得任何數據,客戶端也保持每隔一段固定的時間向伺服器發送一次「保持連接」的請求,伺服器在收到該請求後對客戶端進行回復,表明知道客
戶端「在線」。若伺服器長時間無法收到客戶端的請求,則認為客戶端「下線」,若客戶端長時間無法收到伺服器的回復,則認為網路已經斷開。
三、SOCKET原理
3.1、套接字(socket)概念
套接字(socket)是通信的基石,是支持TCP/IP協議的網路通信的基本操作單元。它是網路通信過程中端點的抽象表示,包含進行網路通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議埠,遠地主機的IP地址,遠地進程的協議埠。
應
用層通過傳輸層進行數據通信時,TCP會遇到同時為多個應用程序進程提供並發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個
TCP協議埠傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了套接字(Socket)介面。應
用層可以和傳輸層通過Socket介面,區分來自不同應用程序進程或網路連接的通信,實現數據傳輸的並發服務。
3.2 、建立socket連接
建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket,另一個運行於伺服器端,稱為ServerSocket。
套接字之間的連接過程分為三個步驟:伺服器監聽,客戶端請求,連接確認。
伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網路狀態,等待客戶端的連接請求。
客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連接的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連接請求。
連
接確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給客戶
端,一旦客戶端確認了此描述,雙方就正式建立連接。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。
3.3、SOCKET連接與TCP連接
創建Socket連接時,可以指定使用的傳輸層協議,Socket可以支持不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連接時,該Socket連接就是一個TCP連接。
3.4、Socket連接與HTTP連接
由
於通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網路應用
中,客戶端到伺服器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的連接而導致
Socket 連接斷連,因此需要通過輪詢告訴網路,該連接處於活躍狀態。
而HTTP連接使用的是「請求—響應」的方式,不僅在請求時需要先建立連接,而且需要客戶端向伺服器發出請求後,伺服器端才能回復數據。
很
多情況下,需要伺服器端主動向客戶端推送數據,保持客戶端與伺服器數據的實時與同步。此時若雙方建立的是Socket連接,伺服器就可以直接將數據傳送給
客戶端;若雙方建立的是HTTP連接,則伺服器需要等到客戶端發送一次請求後才能將數據傳回給客戶端,因此,客戶端定時向伺服器端發送連接請求,不僅可以
保持在線,同時也是在「詢問」伺服器是否有新的數據,如果有就將數據傳給客戶端。
這里我們使用Socket實現一個聊天室的功能,關於伺服器這里的就不介紹了
@interfaceViewController (){
NSInputStream *_inputStream;//對應輸入流
NSOutputStream *_outputStream;//對應輸出流
}
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *inputViewConstraint;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *chatMsgs;//聊天消息數組
@end
懶載入這個消息數組
//從主運行循環移除
//1.建立連接
//定義C語言輸入輸出流
//把C語言的輸入輸出流轉化成OC對象
//設置代理
//把輸入輸入流添加到主運行循環
//不添加主運行循環 代理有可能不工作
//打開輸入輸出流
//登錄
//發送用戶名和密碼
//在這里做的時候,只發用戶名,密碼就不用發送
//如果要登錄,發送的數據格式為 "iam:zhangsan";
//如果要發送聊天消息,數據格式為 "msg:did you have dinner";
//登錄的指令11NSString *loginStr =@"iam:zhangsan";
//把Str轉成NSData
//建立一個緩沖區 可以放1024個位元組
//返回實際裝的位元組數
//把位元組數組轉化成字元串
//從伺服器接收到的數據
//聊天信息
//刷新表格
//發送數據
//發送完數據,清空textField
//數據多,應該往上滾動
}
//監聽鍵盤
//獲取窗口的高度
//鍵盤結束的Frm
//獲取鍵盤結束的y值
D. 簡述基於TCP和UDP的Socket編程的異同
Socket有兩種主要的操作方式:面向連接的和無連接的。無連接的操作使用UDP數據報協議,這個操作不需要連接一個目的的socket,它只是簡單地投出數據報,快速高效,但缺少數據安全性。面向連接的操作使用TCP協議,一個這個模式的socket必須在發送數據之前與目的地的socket取得一個連接,一旦連接建立了,socket就可以使用一個流介面:打開-讀-寫-關閉,所有的發送的信息都會在另一端以同樣的順序被接收,面向連接的操作比無連接的操作效率要低,但數據的安全性更高。基於TCP的socket編程是採用的流式套接字(SOCK_STREAM)。基於UDP採用的數據報套接字(SOCK_DGRAM).
流式套接字的設計是針對面向連接的網路應用,在數據傳輸之前需要預先建立連接,在數據傳輸過程中需要維持連接,在數據傳輸結束後需要釋放連接。由於採用校驗和、確認與超時等差錯控制手段,因此流式套接字可以保證數據傳輸的正確性。
數據報套接字(SOCK_DGRAM)提供無連接的、不可靠的數據傳輸服務,實際上它是基於TCP/IP協議族中的UDP協議實現的。數據報套接字提供無序、有差錯與有重復的數據流服務。數據報套接字的設計是針對無連接的網路應用,在數據傳輸之前不需要預先建立連接。由於只採用很有限的差錯控制手段,因此數據報套接字無法保證數據傳輸的正確性。
E. 學網路安全主要是學哪些技術
一:學網路安全需要的知識:
1、必須精通TCP/IP協議族。
2、學習和了解各種OS 平台,如:linux,UNIX,BSD 等。
3、隨時關注網路安全最新安全動態。
4、熟悉有關網路安全的硬軟體配置方法。尤其交換機和路由的配置。
5、多泡網路安全論壇。
6、終身學習。
二:網路安全必修課程:(後面的教材僅為參考)
0、專業基礎:
1)C/C++:【C++Primer中文版 還有題解c++ primer 需要一定的C++基礎,如果要比較基本的話,錢能的那本不錯,清華大學出版社的。 <<c programming languge>> 全球最經典的C語言教程 中文名字<<c程序設計語言>>】
2)匯編語言 asm
3)操作系統【linux,UNIX,BSD】UBUNTU是linux操作系統 鳥哥的linux私房菜】
4)計算機網路
1、系統編程:(Windows核心及網路編程)
1、精通VC/C++編程,熟悉windows網路SOCKET編程開發
1)《Windows網路編程(第二版)》(附光碟),(美)Anthony Jones, Jim Ohlund著;楊合慶譯;清華大學出版社,2002.1
2)《Windows 核心編程(第四版)》(附光碟),(美)Jetfrey Richter著,王建華 等譯;機械工業出版社,2006.9
2、逆向工程:
1)《加密與解密(第二版)》(附光碟),段鋼 著,電子工業出版社;2004.5
3、網路協議:
1)《計算機網路實驗教程》(《COMPUTER NETWORKS: INTERNET PROTOCOLS IN ACTION》),(美)JEANNA MATTHEWS著,李毅超 曹躍 王鈺 等譯,人民郵電出版社,2006.1
2)《TCP/IP協議詳解�6�1卷一:協議》、《TCP/IP詳解�6�1卷2:實現》、《TCP/IP詳解�6�1卷3:TCP 事務協議、HTTP、NNTP和UNIX域協議》,美 W.Richard Stevens 著,機械工業出版社,2004.9
�6�1或《用TCP/IP進行網際互聯第一卷:原理、協議與結構》、《用TCP/IP進行網際互聯第二卷:設計、實現與內核》、《用TCP/IP 進行網際互聯第三卷:客戶-伺服器編程與應用》(第四版)、(美)Douglas E.Comer林瑤 等,電子工業出版社,2001 年5月
4、網路安全專業知識結構:
1)《信息安全原理與應用(第三版)》(《Security in Computing》),(美)CharlesP Pfleeger,Shari Lawrence Pfleeger著;李毅超,蔡洪斌,譚浩 等譯; 電子工業出版社,2004.7
2)《黑客大曝光--網路安全機密與解決方案》(第五版),(美)Stuart McClure,Joel Scambray, George Kurtz;王吉軍 等譯,清華大學出版社,2006年4月
三:英語學好,也是有用的,尤其是考一些比較有用的證。
F. 在windows下用C語言如何實現socket網路編程,需要用到哪些頭文件或者庫
需要用到的頭文件包含:
#include <winsock2.h>
#include <windows.h>
與Linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫
Winsock,一種標准API,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:
Winsock 1:
Windows CE平台支持。
頭文件:WinSock.h
庫:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數;
頭文件:WinSock2.h
庫:ws2_32.lib
mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll
(6)計算機網路實驗socket編程擴展閱讀
winsock庫的載入與卸載:
載入:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
載入成功,返回值為0。
WORD wVersionRequested:載入的winsock版本,使用宏MAKEWORD(x, y),x表示高位元組,y表示低位元組。然而使用時MAKEWORD(2, 2)。高位元組與低位元組相同~~
LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。
卸載:int WSACleanup(void);比起載入,卸載的函數真是輕松愉快。