淺談傳輸層

1. 傳輸層的作用

在傳輸層中有兩個特別重要的協議 TCP/UDP .
以快遞員送快遞為例說明這個問題吧. 在進行包裹傳輸的過程中快遞員需要根據快遞上的目的地址(目的計算機)來投遞包裹(IP數據報), 加入在快遞單上只寫了收件人的所在地, 所在單位, 而只寫了收件人的姓沒有寫收件人的名字, 此時包裹(數據報)就不知道應該發送給誰, 因此在進行包裹收發的過程中必須寫上收件的詳細名字(應用程序), 此時的收件人的名字就相當于端口號.因此端口號是用來表示一個主機上進行通信的不同應用程序的編號. 其中 IP 數據報分為源 IP 目的 IP 源端口號 目的端口號以及有效載荷

2. 通信處理

TCP / IP 的眾多應用程序都是以客戶端服務器端進行運行. 其中 的客戶端相當于客戶, 而服務器端是用來提供服務的. 作為服務器端的程序必須要先啟動隨時等待客戶的接入. 其中的服務進程都是守護進程. 在確認一個請求究竟是那個服務端發來的, 此時可以通過收到數據報的端口號進行判斷.

3. 兩種協議 TCP/UDP

(1)TCP

TCP是面向連接有可靠性的面向字節流的協議. 其中的字節流表示數據在發送的時候一次可以發送一個數據報, 也可以一次發送10個數據報, 接收數據報的時候一次可以接收1個也可以接收10個. 即數據在接收和發送的時候的數目是一個位置數, 完全由操作系統決定. 但是TCP實行”順序控制”, “重發控制”機制同時也涉及”流量控制”, “擁塞控制”

(2)UDP

UDP 是不具有可靠性傳輸的數據報協議. 它會將細微的處理交給上層的應用層完成. 在 UDP 的情況下, 雖然可以保證發送消息的大小, 但是不能保證消息一定會到達. 如果出錯會進行重發處理.

4. TCP 與 UDP 的區分

TCP 用于傳輸層有必要實現可靠性傳輸的情況下. 但是 UDP 雖然不可靠但是可以用于那些高速傳播的情況下. 比如當我們在看視頻的過程中如果出現數據報的丟失, 那么也將會一小部分的數據報, 如果進行重傳, 那么客戶在觀看視屏的過程中無非就會出現等待時間過長的情況, 此時就需要用 UDP 進行傳輸.

5. TCP 的特點及其目的

為了實現數據的可靠性傳輸, 因此在進行數據的傳輸過程中就必須考慮數據的丟包, 破壞, 重復以及數據的分片順序等等, 因此 TCP 通過檢驗和, 序列號, 確認應答, 重發機制, 連接管理以及窗口控制等實現可靠性傳輸

(1) 通過序號確認序號實現可靠性傳輸

在進行數據的收發過程中, 發送方會將數據發送給接收方, 當接收方接收到數據后會給發送方發送一個確認應答信號代表自己已經接收到數據, 反之, 當發送方發送數據后, 經過一段時間后還沒有接受到對方的確認應答信號, 此時發送方會認為接受方沒有接收到數據, 因此會將數據進行重發直到收到接受方的確認應答信號. 但是有的時候會出現這種情況, 接受方接受到了發送方給自己發送來的數據, 因此接收方給發送方發送了一個確認信號, 但是此時由于信號在傳輸的過程中丟了, 此時發送方也得不到接收方的確認應答信號, 因此發送方會不斷將數據進行發送, 此時接收方就會收到大量的無用的重復數據報, 此時為了給上層提供可靠的數據, 此時接收方就需要扔掉大量的重復數據報, 為了接收方能夠確認自己是否收到重復數據報, 以及自己是否需要接受發送方發送來的數據報, 此時就引入了序列號. 接收方可以通過序列號判斷出自己是否收到了重復數據報, 同時當數據報過大的時候發送方會將數據報進行分組, 為了接收方能夠正確地將這些分組進行正確組裝, 接收方可以通過序列號來正確對數據報進行組裝.

(2)重發超時

重發超時指的是在重發數據之前發送方等待接收方確認應答信號到來的特定時間間隔. 當發送方在等待這段時間之后還沒有接收到接受方的確認應答信號的時候, 此時就需要重新進行數據報的發送.

(3)TCP 以段為單位發送數據

在進行建立連接的同時就已經確定了數據報的單位, 在進行發送的時候, 為了防止在發送的時候對其進行分片和組裝, TCP 在發送的過程中最理想的情況就是發送數據報的時候發送數據報的長度正好我是 IP 數據報不會被分組的最大長度, 這個長度就叫做最大消息長度. 在進行三次握手的時候, 兩個主機會將自己可以處理的最大消息長度寫入到 MSS 選項, 高速對方自己能夠容納的最大消息長度.

(4) 利用窗口控制提高速度

在之前的數據收發過程中發送方發送一個數據報必須等到收到接受方的確認信號后才能進行發送第二個數據報, 這樣顯然就降低了雙方之間的通信效率, 此時為了提高雙方之間的數據傳輸效率, 此時就給雙方定義一個緩沖區, 在接受方緩沖取未滿的情況下, 發送方可以無須等到接受方的確認應答信號才發送數據, 發送方可以一次發送一大批的數據. 此時就會引入窗口這個名詞, 即窗口的大小無非就是發送方無須等待確認應答一次所能繼續發送數據的最的值.

(5)滑動窗口

這里寫圖片描述
正如上圖所示, 透明地方就是滑動窗口, 在窗口左邊代表的是已經收到接受方應答的信號, 窗口內部代表的是對方接受緩沖區的大小, 也是已經發送的數據報但是沒有接受到應答的數據報, 窗口右邊代表的則是還沒有發送的數據報.

(6)窗口控制和重發控制

1)確認信號丟失

在為使用窗口機制的時候, 此時必須等到確認信號到達之后才能進行再次的發送數據. 擔當引入窗口機制的時候, 此時發送方沒有收到接收方的確認應答的時候, 此時由于引入了窗口機制,
發送方可以繼續進行發送, 這是就不需要進行重發.
在收到 ACK 信號的時候窗口會自動向右滑動, 操作系統為了實現這個窗口, 在底層是以緩沖區的形式來維護這個窗口, 只有確認應答過的數據才能從窗口中, 即緩沖區中刪除.

2)數據報丟失

當在數據進行發送的過程中發送的數據報出現丟失時, 此時接收方會給發送端發送重復的確認信號, 這個確認信號仿佛就是在提醒發送方我要收的數據是 XXX 信號, 此時發送方一旦接受到超過連續的相同的確認應答信號時, 此時它就會認為自己發送的數據丟失, 此時就會引發重傳機制.

(7)流量控制

TCP 引入讓發送端根據接收端接受能力的大小確認一次發送的最大數據報的數據量, 這就是流量控制.具體表現在當雙方在建立連接的時候接收方會告訴發送方自己一次可以接收數據的最大量, 這個量的大小就是對方的接受緩沖區的大小, 也就是對方窗口的大小.于是發送方在發送的時候都會發送一個不超過接受方窗口大小的主句量給對方, 使得對方可以接收.當接受方接受到這個數據時, 此時的窗口會立即設置為一個更小的窗口告訴發送方目前自己可以接收的最大數據量.于是雙方就形成了 TCP 的流量控制

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383956.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UVa10375

題目描述很簡單,就是求兩個組合數的商.可是數字范圍很大,肯定不能直接計算. 因此要用到唯一分解定理,即將結果全部表示為素因子的冪的形式. #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #inc…

I/O復用的 select poll和epoll的簡單實現

http://www.cnblogs.com/wj9012/p/3876734.html 一個tcp的客戶端服務器程序 服務器端不變&#xff0c;客戶端通過I/O復用輪詢鍵盤輸入與socket輸入&#xff08;接收客戶端的信息&#xff09; 服務器端&#xff1a; 1 /*服務器:2 1.客戶端關閉后&#xff0c;服務器再向客戶端發送…

netstat 相關命令解析

1.列出所有的端口 netstat -a 列出TCP協議的端口 netstat -at UDP協議的端口 netstat -au 2.列出處于監聽狀態的socket netstat -l 列出監聽的TCP端口 netstat -lt 列出監聽的UDP端口 netstat -lu 列出監聽的UNIX端口 netstat -lx 3.列出協議的統計信息 nestat …

UVa10791

我們可以先用唯一分解定理將這個數字分解成素因子冪的乘積&#xff0c;為了得到最小的和&#xff0c;我們可以發現&#xff1a;每個 素因子的冪單獨分開的和是最小的。 先說明每個素因子都是以出現的最大的次數出現。因為最小公倍數一定&#xff0c;因此至少有一個數字的這個素…

TCP相關代碼

TCP 基礎代碼 //tcp_server.c #include<stdio.h> #include<error.h> #include<sys/types.h> #include<string.h> #include<unistd.h> #include<sys/socket.h> #include<netinet/in.h> #include <arpa/inet.h> #include<st…

UVa1635

我們很容易發現最后每一項的系數就是二項式展開&#xff0c;余數和m沒有關系就意味著可以被m整除&#xff0c;因此我們就需要求出每一個二項式的系數。但是數據實在太大我們根據唯一分解定理將m和系數都進行分解&#xff0c;然后比較因子的冪。 二項式的計算我們可以根據楊輝三…

幾種并發服務器模型的實現:多線程,多進程,select,poll,epoll

http://www.cnblogs.com/wj9012/p/3879605.html 客戶端使用select模型&#xff1a; 1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #include <errno.h>5 #include <sys/types.h>6 #include <sys/socket.h>7 #include …

哈希表1

1. 初始化 void HashInit(HashTable* ht, HashFunc func) {if(ht NULL || func NULL){return;}ht -> size 0;ht -> func func;int i 0;for(; i < HashMaxSize; i){ht -> data[i].state Empty;} } 2. 哈希表的銷毀 void HashDestroy(HashTable* ht) {if(ht…

UVa10820

實質上就是求歐拉函數值 書上有個板子挺好&#xff0c;也不難理解。 #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set>using namespace std;typedef l…

linux socket 編程(C語言)

https://www.cnblogs.com/x_wukong/p/4541010.html 最近看了一些網絡編程的書籍&#xff0c;一直以來總感覺網絡編程神秘莫測&#xff0c;其實網絡編程入門還是很容易學的&#xff0c;下面這些代碼是我在linux下編寫的&#xff0c;已經運行過了&#xff0c;編譯之后就可以運行了…

哈希表2

哈希表的初始化 void HashInit(HashTable* ht, HashFunc func) {if(ht NULL){return;}ht -> size 0;ht -> func func;size_t i 0;for(; i < MaxSize; i){ht -> data[i] NULL;} } 哈希表的結點創建 HashElem* CreateHashElemNode(KeyType key, ValueType va…

位圖

相關數據結構 typedef uint64_t BitmapType;#define BITMAPMAXSIZE 1000 //位圖所能容納的位數typedef struct Bitmap {uint64_t* data;uint64_t capacity; }Bitmap; 初始化 void BitmapInit(Bitmap* bm, uint64_t capacity) {if(bm NULL){return;}//當capacity 100, 2個元…

C++中的inline用法

https://www.cnblogs.com/fnlingnzb-learner/p/6423917.html 1. 引入inline關鍵字的原因 在c/c中&#xff0c;為了解決一些頻繁調用的小函數大量消耗棧空間&#xff08;棧內存&#xff09;的問題&#xff0c;特別的引入了inline修飾符&#xff0c;表示為內聯函數。 棧空間就是指…

UVa1262

算是一個模擬吧 #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set> #include<vector>using namespace std;typedef long long ll; const int INF…

一個Linux下C線程池的實現

http://blog.csdn.net/zouxinfox/article/details/3560891 什么時候需要創建線程池呢&#xff1f;簡單的說&#xff0c;如果一個應用需要頻繁的創建和銷毀線程&#xff0c;而任務執行的時間又非常短&#xff0c;這樣線程創建和銷毀的帶來的開銷就不容忽視&#xff0c;這時也是線…

Gym100917 A - Abstract Picture

模擬賽的時候看這道題沒有什么頭緒&#xff0c;當時有點暈&#xff0c;感冒還沒有好&#xff0c;回來以后瞟了一眼題解就明白了&#xff0c;自己實現了一下&#xff0c;也沒有很復雜。大概的思路就像拓撲排序一樣&#xff0c;需要理解因為涂的是有順序的&#xff0c;所以我們總…

linux進程通信---幾個發送信號的函數(kill,raise,alarm,pause)

http://blog.csdn.net/zzyoucan/article/details/9235685 信號&#xff1a;信號是unix中最古老的進程通信的一種方式&#xff0c;他是軟件層次上對中斷機制的模擬&#xff0c;是一種異步通信方式&#xff0c;信號可以實現用戶空間進程和內核空間進程的交互&#xff0c;內核進程…

數據庫以及表的基本操作

一.數據庫的操作 create database[if not exists]數據庫名; 創建一個名字為company2的使用utf8忽略大小寫的數據庫 create database company charsetutf8 collate utf8_general_ci; 創建一個數據庫區分大小寫 create database company1 charsetutf8 collate utf8_general_bin;…

linux 網絡編程:使用兩線程實現socket同時收發數據

http://blog.csdn.net/li_wen01/article/details/52665505 工作中最近有使用到socket 向客戶端同時發送和接收數據&#xff0c;因為是嵌入式linux設備&#xff0c;且要求只能同時一個客戶端連接該端口。考慮到節省系統資源&#xff0c;只創建了兩個線程分別實現服務端的收發數據…

CF Gym102059 H. Fractions

題目要求找到給定區間的化簡后分子分母的和小于1000的數字的個數 我的想法是先找到所有的滿足要求的最簡分數(總數不超過1e6,而且遠小于),然后對詢問查找每個最簡分數出現的次數. #include<cstdio> #include<cstring> #include<algorithm> #include<cli…