TCP,UDP報文詳解
TCP報文介紹
TCP是一種可靠的、面向連線的位元組流服務。
源主機在傳送資料前需要先和目標主機建立連線。然後,在此連線上,被編號的資料段按序收發。同時,要求對每個資料段進行確認,保證了可靠性。如果在指定的時間內沒有收到目標主機對所發資料段的確認,源主機將再次傳送該資料段。
TCP報文結構
TCP頭部他的標準長度是20位元組。除非出現選項,頭部欄位以32位為單位給出頭部大小(最小值是5)。
源埠
目的埠
序列號
此次傳送的資料在整個報文段中的起始位元組數。此序號用來標識從tcp傳送端向tcp接受端傳送的資料位元組流,seq表示在這個報文段中的第一個資料位元組。如果將位元組流看做在兩個應用程式間的單向流動,則tcp用序號對每個位元組進行計數。32 bit的無符號數。為了安全起見,它的初始值是一個隨機生成的數,它到達2的32次方-1後又從零開始。確認號
是下一個期望接收的位元組,確認序號應當是上次已成功接收的序號+1,只有ack標誌為1時確認序號欄位才有效。一旦一個連線已經建立了,ack總是=1頭部長度
頭部長度給出了頭部的長度,以32位字為單位。他是必需的,因為選項長度是可以變得。作為一個4位的欄位TCP被限制為只能帶60位元組的頭部。而不帶選項大小是20位元組。保留位
在TCP/IP詳解卷中為4位保留位和8個標誌位其中在老的實現中只理解最後的6位。
前兩個不常用的包括:- CWR: 擁塞視窗減(傳送方降低它的傳送速率
- ECE: ECN回顯(傳送方接受到了一個更早的擁塞通告
fin, syn, rst, psh, ack, urg6個標誌位
這6個位域已經保留了超過四分之一個世紀的時間而仍然原封未動,這樣的事實正好也說明了TCP的設計者們考慮的是多麼的周到。它們的含義如下:- FIN::位被用於釋放一個連線。它表示傳送方已經沒有資料要傳輸了。
- SYN:同步序號,用來發起一個連線。syn位被用於建立連線的過程。在連線請求中,syn=1; ack=0表示該資料段沒有使用捎帶的確認域。連線應答捎帶了一個確認,所以有syn=1; ack=1。本質上,syn位被用來表示connection request和connection accepted,然而進一步用ack位來區分這兩種情況。
- RST:該為用於重置一個已經混亂的連線,之所以會混亂,可能是由於主機崩潰,或者其他的原因。該位也可以被用來拒絕一個無效的資料段,或者拒絕一個連線請求。一般而言,如果你得到的資料段設定了rst位,那說明你這一端有了問題。
- PSH:接收方在收到資料後應立即請求將資料遞交給應用程式,而不是將它緩衝起來直到整個緩衝區接收滿為止(這樣做的目的可能是為了效率的原因)
- AVK:ack位被設定為1表示tcphdr->ack_seq是有效的。如果ack為0,則該資料段不包含確認資訊,所以,tcphdr->ack_seq域應該被忽略。
- URG:緊急指標有效
視窗大小
TCP流量控制的一個手段,用來告訴對端TCP緩衝區還能容納多少位元組效驗和
校驗和校驗的是整個tcp報文段,包括tcp首部和tcp資料,這是一個強制性的欄位,一定是由發端計算和儲存,並由收端進行驗證。緊急指標
只有在URG位欄位被設定時才有效。這個指標是一個必須要加到報文段的序列號欄位上的正偏移量,以產生緊急資料的最後一個位元組的序列號選項欄位
最常見的選項欄位就是“最大段大小”選項,稱為MSS。連線的每個端點一般在它傳送的第一個報文段(為了借案例該連線,SYN位欄位被設定的那個報文段)上制定這個選項,MSS指定該選項的傳送者在相反方向上希望接收到的報文段的最大值。
tcp在linux中的結構
struct tcphdr {
__be16 source;// 16位源埠號
__be16 dest; //16位目的埠號
__be32 seq; //序列號
__be32 ack_seq; //確認號
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u16 res1:4,//保留位
doff:4, //tcp報頭長度
fin:1,
syn:1,
rst:1,
psh:1,
ack:1,
urg:1,
ece:1,
cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
__u16 doff:4,
res1:4,
cwr:1,
ece:1,
urg:1,
ack:1,
psh:1,
rst:1,
syn:1,
fin:1;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif
__be16 window;//視窗大小
__be16 check;//效驗和
__be16 urg_ptr;//緊急指標
};
udp報文
UDP報文介紹
UDP協議是提供與IP一樣的不可靠,無連線的交付服務,UDP報文可能出現丟失,重複或者亂序到達等現象。
UDP協議在IP協議上增加了複用、分用和差錯檢測功能。UDP的特點:
- 是無連線的。相比於TCP協議,UDP協議在傳送資料前不需要建立連線,當然也就沒有釋放連線。
- 是盡最大努力交付的。也就是說UDP協議無法保證資料能夠準確的交付到目的主機。也不需要對接收到的UDP報文進行確認。
- 是面向報文的。也就是說UDP協議將應用層傳輸下來的資料封裝在一個UDP包中,不進行拆分或合併。因此,運輸層在收到對方的UDP包後,會去掉首部後,將資料原封不動的交給應用程序。
- 沒有擁塞控制。因此UDP協議的傳送速率不送網路的擁塞度影響。
- UDP支援一對一、一對多、多對一和多對多的互動通訊。
- UDP的頭部佔用較小,只佔用8個位元組。
UDP報文結構
- 源埠:源埠號。在需要對方回信時選用。不需要時可用全0。
- 目的埠:目的埠號。這在終點交付報文時必須要使用到。
- 長度: UDP使用者資料報的長度,其最小值是8(僅有首部)。
校驗和:檢測UDP使用者資料報在傳輸中是否有錯。有錯就丟棄。
UDP報文在linux中的應用
typedef struct udphdr
{
u_short uh_sport;//源埠地址
u_short uh_dport;//目的埠地址
u_short uh_ulen;//UD報文長度
u_short uh_sum;//16位校驗和
}UDP_HEADER;
偽報頭
在 TCP 的分段或 UDP 的資料報格式中,在資料報首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協議欄位、TCP 或 UDP 資料報的總長度等共12位元組,所構成的擴充套件首部結構。此偽首部是一個臨時的結構,它既不向上也不向下傳遞,僅僅只是為了保證可以校驗套接字的正確性。