發新話題
打印

關於CP220x使用TCP傳送的疑問

關於CP220x使用TCP傳送的疑問

此內容有點長, 請看倌耐心看完, 謝謝!!

一般TCP傳送流程都有ACK的封包確認
小弟用Ethernet\TCP_Telnet的範例測試流程
1. PC端丟1111
2. MCU回ACK
3. MCU丟1111
4. PC回ACK
以上是單次標準流程

如果PC端收發部分也改為Echo, 那測試流程會變成如下
1. PC端丟1111
2. MCU回ACK
3. MCU丟1111
4. PC回ACK同時此封包夾帶資料1111
5. MCU回ACK
6. MCU丟1111
7. PC回ACK同時此封包夾帶資料1111
....
...循環下去

用google查詢到TCP說明
"http://www.pcnet.idv.tw/pcnet/network/network_ip_tcp.htm"
Acknowledge Number
回應序號。當接收端接收到 TCP 封包並通過檢驗確認之後﹐會依照發送序號、再加上資料長度產生一個回應序號﹐附在下一個回應封包送回給對方(無需額外的送出專門的確認封包)﹐這樣接收端就知道剛才的封包已經被成功接收到了。

所以我想詢問MCU回ACK之後再丟資料, 這2筆傳送可不可以合併再一次傳送
如果可以該怎麼修改???
我有嘗試過在SCHAR callback_app_process_packet(PSOCKET_INFO socket_ptr)//取消回ACK
{
   socket_ptr = socket_ptr;   // This statment prevents compiler warning.
   //return (1);
   return(NEED_IGNORE_PACKET);
}
但會造成通訊上的錯誤, PC端會一直重送封包
我想應該是要將ACK跟下一筆資料一起傳送才行....

請問有辦法解決嗎???
還是說ACK一定要回應後才能丟資料??不能合併再一起送??

謝謝!!!

TOP

引用:
原帖由 YuchiLiu 於 2012-3-8 16:01 發表

所以我想詢問MCU回ACK之後再丟資料, 這2筆傳送可不可以合併再一次傳送
如果可以該怎麼修改??? ...
你的應用有違 TCP/IP 標準協定,使用TCP做傳輸成層,當接收到TCP封包只有回ACK或不回ACK兩種選擇,你無法在回ACK之前先傳出預定資料再回ACK,或是回ACK同時夾著什麼其它資料一起傳送,若執意這樣做只會造成發送端重送封包,就是你現在得到的結果,所以結論是:TCP ACK一定要回應後才能丟資料。

TOP

我這樣應用並沒有違反TCP/IP
電腦端的確是這樣再傳資料的
可以使用Wireshark來監看封包流量與狀態
如果是2台電腦測試封包傳送Echo, 如下
1. PC1丟資料
2. PC2回應,同時ACK與資料
3. PC1回應,同時ACK與資料
4. PC2回應,同時ACK與資料
.....
循環下去...
直到結束時, 某一方只會回ACK, 如下圖

TOP

F120或F340搭配CP220x測試Echo傳輸,就會是
1. PC端丟1111
2. MCU回ACK
3. MCU丟1111
4. PC回ACK同時此封包夾帶資料1111
5. MCU回ACK
6. MCU丟1111
7. PC回ACK同時此封包夾帶資料1111
....
...循環下去


請問我這樣說明, 你能瞭解嗎??

TOP

我指的是正常的TelNet傳輸中,接收端的API不會在回ACK封包同時夾著Data傳出,例如:Windows內建的超級終端機在TCP/IP連線模式在回ACK就不支援Echo,不曉得你的API是要做何用途? 為何一定要在ACK封包裡硬塞入一些Data同時傳出?  
無論如何,或許你可以修改PC端API在回ACK封包時塞入一些Data同時傳出,但你無法修改MCU端這樣做,因為你用的是Silicon Labs提供的TCP/IP LIB code,這個LIB並不支援這個應用,你還是得先回ACK後在傳Data,除非你自己重寫MCU端的TCP/IP協定程式。

[ 本帖最後由 Stevenyang 於 2012-3-23 14:47 編輯 ]

TOP

你這樣解說, 我就明白了
所以是不行
謝謝!!!

TOP

發新話題