TCP/IP協議中,傳輸層給應用層提供服務
TCP/IP協議棧中,傳輸層只包含兩個協議:緩存
數據在網絡上傳輸,經過網絡層的IP地址找到目標主機,經過傳輸層的端口號定位目標主機上的服務(應用程序)。因此傳輸層爲相互通訊的應用進程提供了邏輯通訊。網絡
端口號:16位,本地惟一便可,只有本地意義。優化
主要特色:操作系統
UDP數據報結構3d
TCP協議的特色指針
流式傳輸cdn
應用層發送數據是把數據放到了操做系統的TCP發送緩存中。操做系統發送時,去TCP發送緩存中取數據組成TCP數據包。應用層一次發送了8個字節的數據,操做系統第一次從發送緩存取出5個字節發送是能夠的。或者應用層分別發送了一個8字節和一個10字節的包,操做系統從緩存中取出18個字節一次發送也是徹底能夠的。接收端解析後,把字節流按順序放入TCP接收緩存,每次從緩存中取必定的字節(跟發送端應用程序一次發送多少個字節沒有關係)數遞交給應用層。blog
因爲應用層一次發送數據的大小和傳輸層一次遞交給接收端應用層的數據的大小不必定徹底同樣,因此應用層須要處理TCP粘包問題。進程
套接字(Socket)資源
IP+端口能夠表達TCP傳輸中的一個端點。IP+Port稱爲套接字。
如何實現可靠傳輸
(後面我會更新一篇專欄更加詳細的闡述可靠性傳輸的實現)
自動重傳協議(ARQ)
發送端發送一個數據以後等待接收端響應成功接收的確認後,再發送下一個數據包(中止等待協議)。
必定時間內沒有收到確認,發送端重傳這個數據包(超時重傳),最大等待時間略大於往返時延(RTT)。因此重傳是自動進行的。
若是接收端發送的確認丟失,或者確認遲到即確認沒有在最大等待時間內到達發送端,這兩種狀況也都會致使發送端進行超時重傳。這種狀況下,接收端會丟棄重複的數據。因此TCP協議還支持去重的功能。
通俗來講,ARQ協議就是,只要你沒在必定時間內告訴我收到了,我就認爲你沒收到。
中止等待協議實現簡單,可是信道利用率低。由於發送數據的時間要遠小於等待的時間。
流水線傳輸
上面提到的ARQ傳輸協議的信道利用率很是低,已經被淘汰。目前TCP協議中採用流水線傳輸。即發送端發送一個數據包後,不等待接收端的ACK就當即發送下一個準備好的數據包。當一個包發送了時間x以後,還沒收到收到這個包的ACK,就會重傳這個包。x的取值略大於網絡的往返時延TTL。假設在時間x內,能夠發送n個數據包,那麼發送端必需要緩存n個尚未收到ack的數據包。即發送端維護一個發送窗口。
發送窗口內是發送了尚未收到ACK的數據包,當發送窗口內有數據收到ACK以後,就能夠被移出窗口,而且窗口左邊沿向前推動。當窗口內的數據大於窗口的最大長度時,就不能繼續發送數據了,須要等待ACK或者進行重傳。
舉個例子,上圖中假如滑動窗口的大小是5,此時窗口已經被佔滿。有兩種狀況,若是收到了數據包1的ACK那麼數據包1被溢出窗口,窗口向前推動繼續發送第6個包。若是沒收到ACK,會重傳數據包1,其實窗口也會向前推動,次數數據包6的內容跟數據包1的內容相同,即數據包1的重傳。
累計確認是對上述機制的進一步優化,即接收端若是收到了連續的數據包一、二、3,只須要在ACK裏回覆收到了3,發送端就能夠隱式的知道一、二、3都發送成功了。
TCP報文段格式: