TCP提供一種面向鏈接的、可靠的字節流服務。其中,面向鏈接意味着兩個使用TCP的應用(一般是一個客戶和一個服務器)在彼此交換數據以前必須先創建一個TCP鏈接。在一個TCP鏈接中,僅有兩方進行彼此通訊;而字節流服務意味着兩個應用程序經過TCP連接交換8bit字節構成的字節流,TCP不在字節流中插入記錄標識符。java
對於可靠性,TCP經過如下方式進行保證:編程
UDP(User Datagram Protocol用戶數據報協議)是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。瀏覽器
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。TCP採用了流量控制、擁塞控制、連續ARQ(Automatic Repeat Request自動重傳請求)等技術來保證它的可靠性。安全
Redis客戶端與Redis服務器之間使用TCP協議進行鏈接,極光推送內部原理也是基於TCP的長鏈接。服務器
一、面向數據報方式;二、網絡數據大多爲短消息;三、擁有大量Client;四、對數據安全性無特殊要求;五、網絡負擔很是重,但對響應速度要求高。網絡
TCP鏈接是一種抽象的概念,表示一條能夠通訊的鏈路。每條TCP鏈接有且僅有兩個端點,表示通訊的雙方。且雙方在任意時刻均可以做爲發送者和接收者。socket
一條TCP鏈接的兩端就是兩個套接字。套接字=IP地址:端口號。所以,TCP鏈接=(套接字1,套接字2)=(IP1:端口號1,IP2:端口號2)函數
一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的
二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
三、TCP面向字節流,TCP把數據當作一連串無結構的字節流;UDP是面向報文的
四、UDP沒有擁塞控制,所以網絡出現擁塞不會使源主機的發送速率下降(對實時應用頗有用,如IP電話,實時視頻會議等),但網絡擁塞時有些報文可能會丟失(因此不可靠)
五、每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊
六、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
七、要求比較高的服務通常使用TCP協議,如FTP、Telnet、HTTP、SMTP(Simple Mail Transfer Protocol簡單郵件傳輸協議)、POP3等,而UDP是面向無鏈接的,使用這個協議的常見服務有DNS(Domain Name System,域名系統)、SNMP(Simple Network Management Protocol,簡單網絡管理協議).net
(1) FTP:定義了文件傳輸協議,使用21端口
(2) Telnet:一種用於遠程登錄的端口,使用23端口,用戶能夠以本身的身份遠程鏈接到計算機上,可提供基於DOS模式下的通訊服務
(3) SMTP:郵件傳送協議,用於發送郵件。服務器開放的是25號端口
(4) POP3:它是和SMTP對應,POP3用於接收郵件。POP3協議所用的是110端口
(5) HTTP:是從Web服務器傳輸超文本到本地瀏覽器的傳送協議視頻
(1) DNS:用於域名(主機名)解析服務,將域名地址轉換爲IP地址。DNS用的是53號端口
(2) SNMP:簡單網絡管理協議,使用161號端口,是用來管理網絡設備的。因爲網絡設備不少,無鏈接的服務就體現出其優點
一般咱們在說到網絡編程時默認是指TCP編程,即用前面提到的socket函數建立一個socket用於TCP通信,函數參數咱們一般填爲SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),這表示創建一個socket用於流式網絡通信。
SOCK_STREAM這種的特色是面向鏈接的,即每次收發數據以前必須經過connect創建鏈接,也是雙向的,即任何一方均可以收發數據,協議自己提供了一些保障機制保證它是可靠的、有序的,即每一個包按照發送的順序到達接收方。
而SOCK_DGRAM這種是User Datagram Protocol協議的網絡通信,它是無鏈接的,不可靠的,由於通信雙方發送數據後不知道對方是否已經收到數據,是否正常收到數據。任何一方創建一個socket之後就能夠用sendto發送數據,也能夠用recvfrom接收數據。根本不關心對方是否存在,是否發送了數據。它的特色是通信速度比較快。你們都知道TCP是要通過三次握手的,而UDP沒有。
Socket用在哪呢,主要用在進程間,網絡間通訊。所謂socket 一般也稱做」套接字「,用於描述IP地址和端口,是一個通訊鏈的句柄。應用程序一般經過」套接字」向網絡發出請求或者應答網絡請求。一條TCP鏈接的兩端就是兩個套接字(套接字=IP地址:端口號)
Socket和ServerSocket類庫位於java.net包中。ServerSocket用於服務器端,Socket是創建網絡鏈接時使用的。在鏈接成功時,應用程序兩端都會產生一個Socket實例,操做這個實例,完成所需的會話。對於一個網絡鏈接來講,套接字是平等的,並無差異,不由於在服務器端或在客戶端而產生不一樣級別。不論是Socket仍是ServerSocket它們的工做都是經過SocketImpl類及其子類完成的。
Accept方法用於產生」阻塞」,直到接受到一個鏈接,而且返回一個客戶端的Socket對象實例。」阻塞」是一個術語,它使程序運行暫時」停留」在這個地方,直到一個會話產生,而後程序繼續;一般」阻塞」是由循環產生的。
getInputStream方法得到網絡鏈接輸入,同時返回一個InputStream對象實例。
getOutputStream方法鏈接的另外一端將獲得輸入,同時返回一個OutputStream對象實例。
注意:其中getInputStream和getOutputStream方法均會產生一個IOException,它必須被捕獲,由於它們返回的流對象,一般都會被另外一個流對象使用。
TCP編程的服務器端通常步驟是:
一、建立一個socket,用函數socket();
二、設置socket屬性,用函數setsockopt(); * 可選
三、綁定IP地址、端口等信息到socket上,用函數bind();
四、開啓監聽,用函數listen();
五、接收客戶端上來的鏈接,用函數accept();
六、收發數據,用函數send()和recv(),或者read()和write();
七、關閉網絡鏈接;
八、關閉監聽;
TCP編程的客戶端通常步驟是:
一、建立一個socket,用函數socket();
二、設置socket屬性,用函數setsockopt();* 可選
三、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
四、設置要鏈接的服務器的IP地址和端口等屬性;
五、鏈接服務器,用函數connect();
六、收發數據,用函數send()和recv(),或者read()和write();
七、關閉網絡鏈接;
UDP編程的服務器端通常步驟是:
一、建立一個socket,用函數socket();
二、設置socket屬性,用函數setsockopt();* 可選
三、綁定IP地址、端口等信息到socket上,用函數bind();
四、循環接收數據,用函數recvfrom();
五、關閉網絡鏈接;
UDP編程的客戶端通常步驟是:
一、建立一個socket,用函數socket();
二、設置socket屬性,用函數setsockopt();* 可選
三、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
四、設置對方的IP地址和端口等屬性;
五、發送數據,用函數sendto();
六、關閉網絡鏈接;