1. 程式人生 > >TCP,UDP報文詳解

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的特點:

  1. 是無連線的。相比於TCP協議,UDP協議在傳送資料前不需要建立連線,當然也就沒有釋放連線。
  2. 是盡最大努力交付的。也就是說UDP協議無法保證資料能夠準確的交付到目的主機。也不需要對接收到的UDP報文進行確認。
  3. 是面向報文的。也就是說UDP協議將應用層傳輸下來的資料封裝在一個UDP包中,不進行拆分或合併。因此,運輸層在收到對方的UDP包後,會去掉首部後,將資料原封不動的交給應用程序。
  4. 沒有擁塞控制。因此UDP協議的傳送速率不送網路的擁塞度影響。
  5. UDP支援一對一、一對多、多對一和多對多的互動通訊。
  6. 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位元組,所構成的擴充套件首部結構。此偽首部是一個臨時的結構,它既不向上也不向下傳遞,僅僅只是為了保證可以校驗套接字的正確性。

這裡寫圖片描述