tcp是tcp/ip協議簇中傳輸層上的一種網路協議,它是一種面向連線的、可靠的協議。為了提供這種可靠性,
tcp實現了各種有效的機制、演算法。為了從一種巨集觀的角度去了解這個協議,這裡先大致地提一下與之相關
的概念。
1. 什麼是『面向連線的』?
引用中的概念:
面向連線意味著兩個使用tcp的應用(通常是乙個客戶和乙個伺服器)在彼此交換資料之前必須先建立
乙個tcp連線。
2. 什麼是『三次握手』?
在建立tcp連線之前,兩個使用tcp的應用需要交換三次網路資料。這三個資料報的來往也就是所謂的『
三次握手』。
3. 報文段segment
我們說tcp是流式的網路協議,那是因為,應用程式可以一直往tcp寫資料,無論你是逐byte,還是write
a chunk,tcp對應用傳給它的資料進行緩衝,直到緩衝資料達到一定尺寸才傳送。可以看出,對於應用
而言,tcp就像是stream的。但事實上,在tcp層,資料還是以塊為單位的。這個塊也就是所謂的報文段
segment。
4. 什麼是mtu?
mtu即最大傳輸單元(maximum transmission unit,mtu)是指一種通訊協議的某一層上面所能通過的
大資料報大小(以位元組為單位)。我個人目前的理解認為,mtu是乙個網路在硬體層次上所允許的最大
資料報大小,例如乙太網大概是1500位元組。
5. 什麼是mss?
mss即最大報文段大小(maximum segment size),它是指tcp中乙個報文段上附加的使用者資料的最大大小。
這裡稍微說下應用層傳送某個資料報時整個tcp/ip協議棧的操作過程:應用層將自己的使用者資料傳給tcp
層(傳輸層),tcp在這些資料前新增自己的協議頭(簡單地理解為附加一些資料),然後將資料交給
ip層(網路層),ip層附加自己的協議頭,以此類推。
雖然mss意思是最大報文段大小,但事實上它是排除了協議頭的使用者資料。
6. mtu and mss ?
可以簡單地給你乙個這樣的公示:mss = mtu - tcp_header_size - ip_header_size。
而通常,ip協議附加的協議頭大小和tcp的協議頭大小都是20位元組,所以通常的mss為1460位元組。
注意,這裡說的數字並不見得正確,因為mss是可以被協商的。各種協議頭也可能被新增附加資料,但是
他們的關係是這樣的。
7. 什麼是視窗大小?
找本tcp的書看下tcp資料報的包頭(本文多次使用資料報、報文的概念,我這裡說的都是一樣的),你會
發現那個16位的視窗大小。
視窗這個域對於整個tcp協議都很重要。簡單地說,視窗大小是指接收端的接收快取的大小。上面說了,應用
在發資料的時候,tcp會快取這些資料,稍後傳送。接收資料時也一樣,tcp接收資料並快取起來,直到應用
呼叫recv之類的函式取資料時,tcp才將這些快取資料清除。
tcp傳送端會根據tcp接收端那個接收快取大小決定傳送多少資料(如何知道這個快取大小?稍後給概念)。
這樣,tcp接收端的接收快取才不至於緩衝溢位。
8. 提供可靠性的方法之一:ack確認?
這裡還不敢提序號、確認號、延時ack等亂七八糟的東西。我只能告訴你,當tcp傳送某些資料給tcp接收方
時,tcp接收方會發回乙個確認報文。tcp傳送方收到這個確認報文後,就可以確認剛才傳送的資料報成功到達。
為什麼這個確認報文叫ack確認(貌似是我臨時給的概念:d)?再翻到tcp包頭結構那張圖,ack是tcp包頭中
的1bit標誌位,如同syn、psh、rst之類的標誌一樣,這些標誌都有乙個專有的用途。當ack標誌位被設定為1
時,我就稱其為ack確認標誌,因為ack就是用於確認報文段的。
在上面所說的視窗大小中,我提到,傳送方如何知道接收方的接收快取大小呢?這也是通過確認報文段實現:
當接收方接收到資料後,傳送ack確認資料報給傳送方,就設定包頭中的視窗域。
9. 提供可靠性的方法之二:各種定時器
tcp中會設定很多計時器,這些定時器大多用於超時重傳(老半天得不到回應,所以重傳資料)。
10.什麼是全雙工?
全雙工就是你可以同時在乙個tcp連線上進行資料的傳送和接收。這種雙工特性也促使了關閉tcp連線時的四次
握手。
11.todo : more concepts...
這裡我盡量簡單地介紹一些tcp中的概念,希望可以讓你有概括性的了解。預計下一節我會講講建立tcp連線的相關細節。
除了stevens的,我推薦,據說是另一部tcp的權威之作。、
tcp要點學習 基礎概念
tcp要點學習 基礎概念 author kevin lynx tcp是tcp ip協議簇中傳輸層上的一種網路協議,它是一種面向連線的 可靠的協議。為了提供這種可靠性,tcp實現了各種有效的機制 演算法。為了從一種巨集觀的角度去了解這個協議,這裡先大致地提一下與之相關 的概念。1.什麼是 面向連線的 ...
tcp要點學習 斷開連線
主要部分,四次握手 斷開連線其實從我的角度看不區分客戶端和伺服器端,任何一方都可以呼叫close or closesocket 之類 的函式開始主動終止乙個連線。這裡先暫時說正常情況。當呼叫close函式斷開乙個連線時,主動斷開的 一方傳送fin finish報文給對方。有了之前的經驗,我想你應該明...
C 學習要點
1.傳指標時,我們可以通過指標來修改它在外部所指向的內容。但如果要修改外部指標所指向的物件是不可能的。例如傳遞外部指標到函式內來分配空間,必須傳遞指標的指標或指標的引用。2.char carry 10 編譯器會將其後所有的東西都置0 3.函式返回值為const時,返回的東西付給乙個型別相同的標示後其...