最近狂補基礎
猛看TCP/IP協議
不過
書上的東西太抽象了
沒有什麼數據實例
看了不
久就忘了
於是
搬來一個sniffer
抓了數據包來看
呵呵
結合書裡面得講解
理解得
比較快
我就來灌點基礎知識
開始吧
先介紹IP協議
IP協議(Internet Protocol)是網絡層協議
用在因特網上
TCP
UDP
ICMP
IGMP數
據都是按照IP數據格式發送得
IP協議提供的是不可靠無連接得服務
IP數據包由一個頭部
和一個正文部分構成
正文主要是傳輸的數據
我們主要來理解頭部數據
可以從其理解到
IP協議
IP數據包頭部格式(RFC
)
Example Internet Datagram Header
上面的就是IP數據的頭部格式
這裡大概地介紹一下
IP頭部由
字節的固定長度和一個可選任意長度部分構成
以大段點機次序傳送
從左到
右
TCP協議
TCP協議(TRANSMISSION CONTROL PROTOCOL)是傳輸層協議
為應用層提供服務
和UDP
不同的是
TCP協議提供的可靠的面向連接的服務
在RFC
中是基本的TCP描述
關於TCP
協議的頭部格式內容的說明
TCP Header FORMat
TCP Header FORMat
跟IP頭部差不多
基本的長度也是
字節
TCP數據包是包含在一個IP數據報文中的
好了
簡單介紹到此為止
來看看我捕獲的例子吧
這是一次FTP的連接
呵呵
是
cuteftp默認的cuteftp的FTP站點
IP地址是
我的IP地址假設為
下面的數據就是TCO/IP連接過程中的數據傳輸
我們可以分析TCP/IP協議數
據格式以及TCP/IP連接的三次握手(ThreeWay
Handshake)情況
下面的這些十六進制數據
只是TCP/IP協議的數據
不是完整的網絡通訊數據
第一次
我向FTP站點發送連接請求(我把TCP數據的可選部分去掉了)
>
IP頭部
c
c
a
d
e
TCP頭部
d
f a
c
來看看IP頭部的數據是些什麼
第一字節
其中
是IP協議的版本(Version)
說明是IP
是IHL
位
表示IP頭部的長度
是一個
bit字段
最大就是
了
值為
IP頭部的最大長度就
是
字節
而這裡為
說明是
字節
這是標准的IP頭部長度
頭部報文中沒有發送
可選部分數據
接下來的一個字節
是服務類型(Type of Service)
這個
bit字段由
bit的優先
權子字段(現在已經被忽略)
bit的TOS子字段以及
bit的未用字段(現在為
)構成
bit的TOS子字段包含
最小延時
最大吞吐量
最高可靠性以及最小費用構成
這四個
bit位最多只能有一個為
本例中都為
表示是一般服務
接著的兩個字節
是IP數據報文總長
包含頭部以及數據
這裡表示
字節
這
字節由
字節的IP頭部以及
字節的TCP頭構成(本來截取的TCP頭應該是
字節的
其中
字節為可選部分
被我省去了)
因此目前最大的IP數據包長度是
字節
再是兩個字節的標志位(Identification)
轉換為十進制就是
這個
是讓目的主機來判斷新來的分段屬於哪個分組
下一個字節
轉換為二進制就是
其中第一位是IP協議目前沒有用
上的
為
接著的是兩個標志DF和MF
DF為
表示不要分段
MF為
表示還有進一步的分段
(本例為
)
然後的
是分段便移(Fragment Offset)
這個字節就是TTL(Time To Live)了
表示一個IP數據流的生命周期
用Ping顯
示的結果
能得到TTL的值
很多文章就說通過TTL位來判別主機類型
因為一般主機都有默
認的TTL值
不同系統的默認值不一樣
比如WINDOWS為
不過
一般Ping得到的都不是
默認值
這是因為每次IP數據包經過一個路由器的時候TTL就減一
當減到
時
這個數據包
就消亡了
這也時Tracert的原理
本例中為
轉換為十進制就是
了
我用的
WIN
繼續下來的是
這個字節表示傳輸層的協議類型(Protocol)
在RFC
中有定
義
表示傳輸層是TCP協議
c
這個
bit是頭校驗和(Header Checksum)
接下來
c
a
這個就是源地址(Source Address)了
也就是我的IP地址
轉換為十進制的IP地址就是
同樣
繼續下來的
位
d
e
是目標
地址
好了
真累啊
終於看完基本的
字節的IP數據報頭了
繼續看TCP的頭部吧
這個是作
為IP數據包的數據部分傳輸的
TCP頭部
d
f a
c
一來就是一個兩字節段
d
表示本地端口號
轉換為十進制就是
第二個兩
字節段
表示目標端口
因為我是連接FTP站點
所以
這個就是
啦
十六進制當
然就是
接下來的四個字節
f a
是順序號(Sequence Number)
簡寫為SEQ
SEQ=
下面的四個字節
是確認號(Acknowledgment Number)
簡寫為
ACKNUM
繼續兩個字節
轉換為二進制吧
這兩個字節
總共
bit
有好多東西呢
第一個
bit
是TCP頭長
十進制為
表示
個字節
(剛才說了
我省略了
字節的option數據
所以你只看見了
字節)
接著的
bit現在TCP
協議沒有用上
都為
最後的
bit
是六個重要的標志
這是兩個計算機數據交
流的信息標志
接收和發送斷根據這些標志來確定信息流的種類
下面是一些介紹
URG
(Urgent Pointer field significant)緊急指針
用到的時候值為
用來處理避
免TCP數據流中斷
ACK
(Acknowledgment field significant)置
時表示確認號(Acknowledgment
Number)為合法
為
的時候表示數據段不包含確認信息
確認號被忽略
PSH
(Push Function)
PUSH標志的數據
置
時請求的數據段在接收方得到後就可直
接送到應用程序
而不必等到緩沖區滿時才傳送
RST
(Reset the connection)用於復位因某種原因引起出現的錯誤連接
也用來拒絕
非法數據和請求
如果接收到RST位時候
通常發生了某些錯誤
SYN
(Synchronize sequence numbers)用來建立連接
在連接請求中
SYN=
ACK=
連接響應時
SYN=
ACK=
即
SYN和ACK來區分Connection Request和
Connection Accepted
FIN
(No more data from sender)用來釋放連接
表明發送方已經沒有數據發送了
這
個標志位
你們自己對號入座吧
本例中SYN=
ACK=
當然就是表示連接請求了
我們可以注意下面兩個過程的這兩位的變換
後面的
c
不講了
呵呵
偷懶了
後面兩次通訊的數據
自己分開看吧
我們看看連接的過程
一些重要地方的變化
第二次
FTP站點返回一個可以連接的信號
>
IP頭部
c c
be
a
cd ba d
e
c
a
TCP頭部
d
b
f
c
f a
第三次
我確認連接
TCP連接建立起來
>
IP頭部
c
a c
a
d
e
TCP頭部
d
f a
b
f
c
b
b
c
好
我們看看整個Threeway_handshake過程
第一步
我發出連接請求
TCP數據為
SEQ=
f a
ACKNUM=
SYN=
ACK=
第二步
對方確認可以連接
TCP數據為
SEQ=
b
f
c
ACKNUM=
f a
SYN=
ACK=
第三步
我確認建立連接
SEQ=
f a
ACKNUM=
b
f
c
SYN=
ACK=
可以看出什麼變化麼?正式建立連接了呢
這些東西是什麼值?
我接收從
>
的下一個數據包中
SEQ=
b
f
c
ACKNUM=
f a
SYN=
ACK=
這些都是很基礎的東西
對於編寫sniffer這樣的東西是必須非常熟悉的
這裡只講解了
TCP/IP協議的一點點東西
主要是頭部數據的格式
From:http://tw.wingwit.com/Article/Network/201311/30091.html