2017-06-23 91 views
0

我使用openvswitch在流表中使用多個操作。當我想修改TCP ipv4_dst並將數據包複製到另一個輸出端口時,數據包的確認號碼會隨機更改。而且我不更改IP標頭中的其他字段。爲什麼會發生?我不想看到數字的變化。openvswitch在哪裏處理TCP seq和ack?

流表項: OFPST_FLOW回覆(OF1.3)(XID = 0×2): 餅乾=爲0x0,持續時間= 6.846s,表= 0,n_packets = 0,n_bytes = 0,優先級= 6,TCP ,nw_src = 10.0.0.2,nw_dst = 10.0.0.1 actions = output:1

cookie = 0x0,duration = 6.846s,table = 0,n_packets = 0,n_bytes = 0,priority = 7,tcp,nw_src = 10.0.0.1,nw_dst = 10.0.0.2 actions = output:2,set_field:10.0.0.3-> ip_dst,set_field:00:00:00:00:00:03-> eth_dst,輸出:3

cookie = 0x0,duration = 6.846s,table = 0,n_packets = 0,n_bytes = 0,priority = 8,tcp,nw_src = 10.0.0.3,nw_dst = 10.0.0.1 actions =輸出:1

餅乾=爲0x0,持續時間= 6.847s,表= 0,n_packets = 0,n_bytes = 0,優先= 0行動= CONTROLLER:65535

拓撲: 10.0.0.1 ------- -switch -------- 10.0.0.2 | | 10.0.0.3 enter image description here

+0

只有[目標IP和校驗和應該改變](https://github.com/openvswitch/ovs/blob/457402dc2aaa2a73e5a3142962d4a091379170cc/datapath/actions.c#L415-L422)。你能顯示流量表的內容嗎? – pchaigno

+0

我添加上面的流程表。我已經在一些不同的情況下進行了測試。我發現,當我輸出到端口2時,更改目標IP並輸出到端口3時,確認號碼將被更改。但是,當我輸出到端口2時,更改目標MAC地址並輸出到端口3,確認號碼將是正確的。我不知道爲什麼 – killua

回答

0

使用Mininet重現您的設置後,我無法重現此問題。

  1. Open vSwitch's code to change IP addresses is pretty straightforward。沒有提及序列號。
  2. 我用ovs-appctl ofproto/trace跟蹤打開虛擬交換機的行爲接收TCP數據包時:

    ovs-appctl ofproto/trace s1 in_port=1,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,tcp,nw_src=10.0.0.1,nw_dst=10.0.0.2 
    

    輸出不包括任何序列號修飾。

  3. 我使用Wireshark比較了端口2和端口3上的數據包。他們在我的情況下有完全相同的ACK數字。

這三點讓我相信你的問題不是來自Open vSwitch。 ACK號碼修改是否來自其他一些軟件?你是在Mininet還是在物理主機上運行實驗?

+0

感激看到你的答案。我今天也重複了我的經驗。我在Mininet運行這個實驗。我在/ var/log/syslog中打印了ack號碼,發現:ack號碼不會隨着你所提到的功能而改變,但wireshark中顯示的ack號碼會發生變化(我將顯示上圖。)令我困惑的是:如果我更改數據包的dst_IP和out_port,ack數字將在wireshark中更改,但如果我更改了dst_IP並且不更改out_port,則在wireshark中不會更改ack數字。 – killua

+0

TCP流:host1到host2。 1:inport = 1,actions:output_port:到host2,set_field(dst_IP = host3,dst_mac = host3),output_port:到host3。 (在output_port中顯示給主機3的確認編號被更改爲隨機數。) 2:inport = 1,actions:output_port:到host2,set_field(dst_IP = host3,dst_mac = host3),output_port:到host2。 (確認號碼正常。) 真奇怪。 – killua

0

我找到了答案。 由於在Linux內核中監視了tcp連接,我們無法複製tcp狀態。

+0

您能否進一步解釋如何更改ACK編號? – pchaigno

+0

對不起,我做出了錯誤的答案。事實是,當我們複製TCP數據包時,來自接收方的數據包ACK中的seq不同,因爲初始seq是由主機隨機生成的。但是,下面的TCP數據包副本基於第一個TCP連接,因此它不能保證所有TCP連接的ACK編號的正確性。 – killua