『壹』 soap 數組類型的參數如何設定
請問<wsdl:part name="callee" type="impl:ArrayOf_xsd_string" /> impl:ArrayOf_xsd_string字元串你是怎麼表達的?
『貳』 如何設計soap協議傳輸附件的介面
沒寫過web service的東西,是不是提供一種以XML為傳輸介質的服務?
下面是網上摘抄的
--------------------------------
1 Web Service的傳輸協議概述
Web Service的傳輸協議概述在ASP.NET 中,XML Web Service支持3種協議來與用戶交流數據。這3種協議分別是:
1.HTTP-GET
2.HTTP-POST
3.SOAP
在這3種協議中,HTTP(Hypertext Transfer Protocol)已經是眾所周知的協議了,它是XML Web Service數據傳輸的標准,其中包括使用SOAP傳輸數據。HTTP將SOAP消息壓縮,然後以HTTP傳輸協議的形式進行網路傳輸。然而在XML Web Service下使用HTTP-GET和HTTP-POST的時候,事實上是指有關單獨使用HTTP調用XML Web Service中的方法的能力,而不使用SOAP。
在HTTP中,GET和POST並不是一種協議,它們是可以用來與Web Service交互的幾種方法中的其中兩種。然而,這二種方法的傳送參數和數據的能力使它們變成了一種簡單的,非常適合用來調用XML Web Service的工具。
SOAP是XML Web Service最常用到的連接協議。與HTTP相比,SOAP顯的更為復雜,但卻擁有更強的接受能力。SOAP是一種以XML為基礎的協議,它提供一種將數據打包(Packaging)和編碼(Encoding)的方法,以用於網路的數據傳輸。任意一個用戶都可以使用SOAP協議與任何一個XML Web Service進行通信,甚至於這個XML Web Service不是建立在.NET 平台上的,比如說Java的,都可以利用SOAP來進行數據傳輸。因此可見,SOAP也是Language Independent(語言獨立性)。
2
HTTP-GET和HTTP-POSTHTTP-GET 和 HTTP-POST 是使用 HTTP(超文本傳輸協議)謂詞以及與之關聯的請求語義將參數作為名稱/值對編碼和傳遞的標准協議。每個協議都由一系列 HTTP 請求頭組成,這些頭與一些其他信息一起定義客戶端向伺服器請求的內容,而在成功時,伺服器將用一系列 HTTP 響應頭和所請求的數據響應。
HTTP-GET的處理特徵如下:
l
將數據添加到URL。
l
利用一個問號(「?」)代表URL地址的結尾與數據的開端。
l
每一個數據的元素以 名稱/值的形式出現。
l
利用一個分號(「;」)來區分多個數據元素。
HTTP-POST的處理特徵如下:
l
將數據包括在HTTP主體中。
l
同樣的,數據的元素以名稱/值的形式出現。
l
但是每一個數據元素分別佔用主體的一行。
3
SOAP協議SOAP(Simple Object Access Protocol)簡單對象訪問協議,它是輕型協議,用於分散的、分布式計算環境中交換信息。SOAP有助於以獨立於平台的方式訪問對象、服務和伺服器。它藉助於XML,提供了HTTP所需的擴展。
SOAP協議規范由4個主要的部分組成。
第一部分:SOAP封裝(Envelop)定義了一個描述消息的內容多少、誰發送、誰應當接受並且處理以及如何處理它們的框架。
第二部分:SOAP編碼規則(Encoding Rules)定義了可選數據編碼規則,用於表示應用程序定義的數據類型和直接圖表,以及一個用於序列化非語法數據模型統一標准。
第三部分:SOAP RPC表示(RPC Representation)定義一個遠程調用風格(請求/響應)信息交換的模式。
第四部分:SOAP綁定(Binding)定義了SOAP和HTTP之間的綁定和使用底層協議的交換。
SOAP協議可以簡單地理解為:SOAP=RPC+HTTP+XML,即採用HTTP作為通信協議,RPC作為一致性的調用途徑,XML作為數據傳送的格式,從而允許服務提供者和服務客戶經過防火牆在Internet上進行通信交互。
另外,團IDC網上有許多產品團購,便宜有口碑
『叄』 如何發送/使用C#接收SOAP請求和響應
假設A是客戶端,B是webservice服務端,用戶通過http協議向伺服器發送soap請求,webservice返回客戶端XML格式的數據。
現在我們看一看創建一個webservice的大致過程:
服務端的webservice是必須要建的。中間的soap,xml我們不用去關心,在客戶端這邊,比較重要的是如何從webservice取得對象?答案是用的是proxy對象。客戶端由代理對象(proxy)負責與webservice的通信。所以在客戶端使用webservice,完全和使用一個本地對象是一樣的。
在客戶端右鍵單擊右邊的reference(引用),選擇」添加引用」,選擇瀏覽,找到webserver目錄下的bin目錄下的webserver.dll
再加入一個system.web.webservices的引用,在列表中有。
在form1.cs里,加入
using System.Web.Services;
using webserver;
『肆』 如何通過SOAP發送二進制數據
Server端代碼:
OMFactory messageFactory = OMAbstractFactory.getOMFactory();
OMNamespace ns = messageFactory.createOMNamespace("urn:foo" , "foo");
OMElement binEle = messageFactory.createOMElement("payload",ns);
File att = new File("someBinaryData");
log.info("is attachement exist? = " + att.exists());
FileDataSource src = new FileDataSource(att);
DataHandler handler = new DataHandler(src);
OMText textNode = messageFactory.createOMText(handler, true);
binEle.addChild(textNode);
element.addChild(binEle);
如果要禁用MTOM,只要在對應節點加上
textNode.setOptimize(false); 就可以了,Axis2將使用Base64編碼來處理二進制數據。
Client代碼:
設置客戶端支持MTOM:
ServiceClient wsClient = new ServiceClient();
Options clientOptions = new Options();
clientOptions.setTo(new EndpointReference("http://some/service"));
clientOptions.setAction("foo");
clientOptions.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE); // enable MTOM
wsClient.setOptions(clientOptions); 取得二進制數據的方法
OMElement dataElement = result.getFirstChildWithName(new QName("urn:foo", "payload"));
OMText dataNode = (OMText) dataElement.getFirstOMChild();
DataHandler handler = (DataHandler) dataNode.getDataHandler();
InputStream is = handler.getDataSource().getInputStream();
Client通過MTOM傳輸二進制數據到Server端的方法與Server端類似,只不過是把帶有二進制數據的節點添加到要發送出去的OMElement上。
Axis2配置
在axis2.xml裡面修改enableMTOM為true,默認是false。
<parameter name="enableMTOM">true</parameter>
註:在應用MTOM傳輸二進制數據時,可以注意到HTTP頭裡面的消息類型是messageType=application/xop+xml。
『伍』 如何運行soapserver服務端
一般都是先知道soap埠,才能通過jmx監控was的程序,當然你可以通過配置文件得到這個埠號。最快的辦法,登錄WAS console,選擇server-》application server-》server1(default),從這里邊找到port一項,然後展開就可看到所有你需要的埠,默認SOAP是8880。
『陸』 Jmeter發送SOAP請求對WebService介面測試
1. 建立WebServiceTest Plan
1) 添加ThreadGroup
右鍵單擊Test Plan選擇Add --> ThreadGroup,配置
Number of Threads、Ramp-UpPeriod、Loop Count可隨測試不同隨時修改。
三種參數解釋如下:
Number of Threads為發起線程總數。
Ramp-Up Period 指定了JMeter開啟Number ofThreads個線程所需的時間。例如,如果待發起30個線程(即模擬用戶),Ram-Up Period為15秒,則每秒增加2個線程(30個用戶/15秒)。如果設置為0,則JMeter會自動啟動所有模擬用戶。
Loop Count為循環次數。
2. 添加 WebService Requests
右鍵單擊「WebService線程組」,Add --> Sampler --> WebService(SOAP)。
註:灰色「線程組」為其它測試使用過的線程組,此處這設置為Disabled線程組,在本次測試中不使用。
配置
將發布好的Service的 WSDL URL粘貼到WSDL URL中點擊Load WSDL之後,WebMthods自動彈出,
只需自己選擇Method然後單擊Configure即可完成絕大部分自動配置
但是裡面會涉及Soap/XML-RPC Data的編寫,我編寫的如下:
[plain] view plain
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:simpleMethod
xmlns:ns1="http://server.deltaj.com">
<name xsi:type="xsd:string">Yerasel</name>
</ns1:simpleMethod>
</soap:Body>
</soap:Envelope>
這個XML中絕大部分都是固定的。其餘解釋如下:
simpleMethod是WebService發布的方法;
http://server.deltaj.com是simpleMethod所在類(SimpleServer)的域名,即SimpleServer所在包的包名為com.deltaj.server;
name是simpleMethod的參數名,參數類型是string;
Yerasel是輸入的實參。
SimpleService服務端源程序如下:
[java] view plain
// SimpleService.java
package com.deltaj.server;
public class SimpleServer {
/**
* 簡單的測試方法
*
*/
public String simpleMethod(String name) {
return name + "Say this is a Simple method ^-^";
}
}
注意:
<arg0 xsi:type="xsd:string">Yerasel</arg0>也可以,
在發布成wsdl時候, 方法的參數名稱被自動的映射成arg0, arg1, 解決方法如下:
[java] view plain
Java代碼
public User create(
@WebParam(name = "user")
User user);
因此SimpleService服務端源程序改寫如下:
[java] view plain
// SimpleService.java
package com.deltaj.server;
public class SimpleServer {
/**
* 簡單的測試方法
*
*/
public String simpleMethod(@WebParam(name = "personname")String personname) {
return personname + "Say this is a Simple method ^-^";
}
}
Soap/XML-RPC Data 如下:
[plain] view plain
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:simpleMethod
xmlns:ns1="http://server.deltaj.com">
<personname xsi:type="xsd:string">Yerasel </personname>
</ns1:simpleMethod>
</soap:Body>
</soap:Envelope>
註:
發布SimpleServer時,需要寫xml,這是發布WebService的一般步驟,內容如下:
[plain] view plain
<serviceGroup>
<service name="SimpleServer" scope="application">
<description>
SimpleServer
</description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass">com.deltaj.server.SimpleServer</parameter>
</service>
</serviceGroup>
文件名為META-INF/services.xml。
文件布局
com裡面是包以及.class
然後,在bin目錄下運行"jar cvf SimpleServer.aar . "即可
將aar放入Tomcat的services目錄中即可發布。
『柒』 如何配置 SOAP 發送埠
可以通過編程方式或使用 BizTalk 管理控制台來配置 WCF-NetNamedPipe 發送埠。
如何以編程方式配置 WCF-NetNamedPipe 發送埠
BizTalk 瀏覽器對象模型為發送埠公開了一種特定於適配器的介面,該介面名為 ITransportInfo,具有 TransportTypeData 讀/寫屬性。此屬性接受 XML 字元串的名稱-值對形式的 WCF-NetNamedPipe 發送埠配置屬性包。
『捌』 如何用soap傳遞xml文檔
給你一個代碼
public class Client {
public static void main(String[] args) {
Service service = new ServiceLocator();
ServiceSoap_PortType serviceSoap = null;
try {
serviceSoap = service.getServiceSoap();
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Properties props = System.getProperties();
props.setProperty("http.proxyHost", "192.168.0.150");
props.setProperty("http.proxyPort", "808");
String[] weathers = serviceSoap.getWeatherbyCityName("北京", TheDayFlagEnum.theDayafterTomorrow);
for (int i=0; i<weathers.length; i++ ) {
System.out.println(weathers[i]);
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//cmd命令
set AXIS_HOME=D:\apache-tomcat-5.5.17\webapps\axis\WEB-INF
set CLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar
//weather.xml是你要解析的文件 也可以把weather.xml換成你要解析的xml文件在那個網站裡面
java org.apache.axis.wsdl.WSDL2Java -p clientweather weather.xml
『玖』 如何查看linux soap port
如何查看linux soap port一般都是先知道soap埠,才能通過jmx監控was的程序,當然你可以通過配置文件得到這個埠號。最快的辦法,登錄WAS console,選擇server-》application server-》server1(default),從這里邊找到port一項,然後展開就可看到所有你需要的埠,...
『拾』 用tcp完成SOAP數據傳輸應該怎麼實現
1.採用面向連接的三次握手實現可靠對象傳輸。
2.使用數據窗口機制協商隊列大小實現數據隊列傳輸。
3.通過序列化應答和必要時重發數據包,TCP 為應用程序提供了可靠的傳輸流和虛擬連接服務。
下面是找到的長篇大論中比較好的文章:
一、TCP協議
1、TCP 通過以下方式提供可靠性:
◆ 應用程序分割為TCP認為最合適發送的數據塊。由TCP傳遞給IP的信息單位叫做報文段。
◆ 當TCP發出一個報文段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能記時收到一個確認,它 就重發這個報文段。
◆ 當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常延遲幾分之一秒。
◆ TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化如果收到報文段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到這個報文段。
◆ 既然TCP報文段作為IP數據報來傳輸,而IP數據報的到達可能失序,因此TCP報文段的到達也可能失序。如果必要,TCP將對收到的數據進行排序,將收到的數據以正確的順序交給應用層。
◆ 既然IP數據報會發生重復,TCP連接端必須丟棄重復的數據。
◆ TCP還能提供流量控制,TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發送接收端緩沖區所能接納的數據。這將防止較快主機致使較慢主機的緩沖區溢出。
另外,TCP對位元組流的內容不作任何解釋。
2、TCP首部:
TCP數據被封裝在一個IP數據報中,格式如下:
IP首部20 TCP首部20 TCP首部
TCP首部格式如下:
16位源埠號 16位目的埠號
32位序號
32位確認序號
4位首部長度 保留6位 U
R
G A
C
K P
S
H R
S
T S
Y
N F
I
N 16位窗口大小
16位檢驗和 16位緊急指針
選項
數據
說明:
(1)每個TCP段都包括源端和目的端的埠號,用於尋找發送端和接收端的應用進程。這兩個值加上IP首部的源端IP地址和目的端IP地址唯一確定一個TCP連接。
(2)序號用來標識從TCP發送端向接收端發送的數據位元組流,它表示在這個報文段中的第一個數據位元組。如果將位元組流看作在兩個應用程序間的單向流動,則TCP用序號對每個位元組進行計數。
(3)當建立一個新連接時,SYN標志變1。序號欄位包含由這個主機選擇的該連接的初始序號ISN,該主機要發送數據的第一個位元組的序號為這個ISN加1,因為SYN標志使用了一個序號。
(4)既然每個被傳輸的位元組都被計數,確認序號包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當時上次已成功收到數據位元組序號加1。只有ACK標志為1時確認序號欄位才有效。
(5)發送ACK無需任何代價,因為32位的確認序號欄位和ACK標志一樣,總是TCP首部的一部分。因此一旦一個連接建立起來,這個欄位總是被設置,ACK標志也總是被設置為1。
(6)TCP為應用層提供全雙工的服務。因此,連接的每一端必須保持每個方向上的傳輸數據序號。
(7)TCP可以表述為一個沒有選擇確認或否認的華東窗口協議。因此TCP首部中的確認序號表示發送方已成功收到位元組,但還不包含確認序號所指的位元組。當前還無法對數據流中選定的部分進行確認。
(8)首部長度需要設置,因為任選欄位的長度是可變的。TCP首部最多60個位元組。
(9)6個標志位中的多個可同時設置為1
◆ URG-緊急指針有效
◆ ACK-確認序號有效
◆ PSH-接收方應盡快將這個報文段交給應用層
◆ RST-重建連接
◆ SYN-同步序號用來發起一個連接
◆ FIN-發送端完成發送任務
(10)TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小為位元組數,起始於確認序號欄位指明的值,這個值是接收端期望接收的位元組數。窗口大小是一個16為的欄位,因而窗口大小最大為65535位元組。
(11)檢驗和覆蓋整個TCP報文端:TCP首部和TCP數據。這是一個強制性的欄位,一定是由發送端計算和存儲,並由接收端進行驗證。TCP檢驗和的計算和UDP首部檢驗和的計算一樣,也使用偽首部。
(12)緊急指針是一個正的偏移量,黃蓉序號欄位中的值相加表示緊急數據最後一個位元組的序號。TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。
(13)最常見的可選欄位是最長報文大小MMS,每個連接方通常都在通信的第一個報文段中指明這個選項。它指明本端所能接收的最大長度的報文段。
二、TCP連接的建立和終止
1、建立連接協議
(1) 請求端發送一個SYN段指明客戶打算連接的伺服器的埠,隱疾初始序號(ISN),這個SYN報文段為報文段1。
(2) 伺服器端發回包含伺服器的初始序號的SYN報文段(報文段2)作為應答。同時將確認序號設置為客戶的ISN加1以對客戶的SYN報文段進行確認。一個SYN將佔用一個序號。
(3) 客戶必須將確認序號設置為伺服器的ISN加1以對伺服器的SYN報文段進行確認(報文段3)。
這3個報文段完成連接的建立,稱為三次握手。發送第一個SYN的一端將執行主動打開,接收這個SYN並發回下一個SYN的另一端執行被動打開。
2、連接終止協議
由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個FIN只意味著這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
(1) TCP客戶端發送一個FIN,用來關閉客戶到伺服器的數據傳送(報文段4)。
(2) 伺服器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。
(3) 伺服器關閉客戶端的連接,發送一個FIN給客戶端(報文段6)。
(4) 客戶段發回確認,並將確認序號設置為收到序號加1(報文段7)。
3、連接建立的超時
如果與伺服器無法建立連接,客戶端就會三次向伺服器發送連接請求。在規定的時間內伺服器未應答,則連接失敗。
4、最大報文段長度MSS
最大報文段長度表示TCP傳往另一端的最大塊數據的長度。當一個連接建立時,連接的雙方都要通告各自的MSS。
一般,如果沒有分段發生,MSS還是越大越好。報文段越大允許每個報文段傳送的數據越多,相對IP和TCP首部有更高的網路利用率。當TCP發送一個 SYN時,它能將MSS值設置為外出介面的MTU長度減去IP首部和TCP首部長度。對於乙太網,MSS值可達1460。
如果目的地址為非本地的,MSS值通常默認為536,是否本地主要通過網路號區分。MSS讓主機限制另一端發送數據報的長度,加上主機也能控制它發送數據報的長度,這將使以較小MTU連接到一個網路上的主機避免分段。
5、 TCP的半關閉
TCP提供了連接的一端在結束它的發送後還能接收來自另一端數據的能力,這就是TCP的半關閉。
客戶端發送FIN,另一端發送對這個FIN的ACK報文段。當收到半關閉的一端在完成它的數據傳送後,才發送FIN關閉這個方向的連接,客戶端再對這個FIN確認,這個連接才徹底關閉。
6、2MSL連接
TIME_WAIT狀態也稱為2MSL等待狀態。每個TCP必須選擇一個報文段最大生存時間(MSL)。它是任何報文段被丟棄前在網路的最長時間。
處理原則:當TCP執行一個主動關閉,並發回最後一個ACK,該連接必須在TIME_WAIT狀態停留的時間為2MSL。這樣可以讓TCP再次發送最後的ACK以避免這個ACK丟失(另一端超時並重發最後的FIN)。這種2MSL等待的另一個結果是這個TCP連接在2MSL等待期間,定義這個連接的插口不能被使用。
7、平靜時間
TCP在重啟的MSL秒內不能建立任何連接,這就是平靜時間。
8、FIN_WAIT_2狀態
在FIN_WAIT_2狀態我們已經發出了FIN,並且另一端也對它進行了確認。只有另一端的進程完成了這個關閉,我們這端才會從 FIN_WAIT_2狀態進入TIME_WAIT狀態。這意味著我們這端可能永遠保持這個狀態,另一端也將處於CLOSE_WAIT狀態,並一直保持這個狀態直到應用層決定進行關閉。
9、復位報文段
TCP首部的RST位是用於復位的。一般,無論合適一個報文端發往相關的連接出現錯誤,TCP都會發出一個復位報文段。主要情況:
(1)到不存在的埠的連接請求;
(2)異常終止一個連接。
10、同時打開
為了處理同時打開,對於同時打開它僅建立一條連接而不是兩條連接。兩端幾乎在同時發送SYN,並進入SYN_SENT狀態。當每一端收到SYN時,狀態變為SYN_RCVD,同時他們都再發SYN並對收到的SYN進行確認。當雙方都收到SYN及相應的ACK時,狀態都變為ESTABLISHED。一個同時打開的連接需要交換4個報文段,比正常的三次握手多了一次。
11、 同時關閉
當應用層發出關閉命令,兩端均從ESTABLISHED變為FIN_WAIT_1。這將導致雙方各發送一個FIN,兩個FIN經過網路傳送後分別到達另一端。收到FIN後,狀態由FIN_WAIT_1變為CLOSING,並發送最後的ACK。當收到最後的ACK,狀態變為TIME_WAIT。同時關閉和正常關閉的段減緩數目相同。
12、TCP選項
每個選項的開始是1位元組的kind欄位,說明選項的類型。
Kind=1:選項表結束(1位元組) Kind=1:無操作(1位元組) Kind=2:最大報文段長度(4位元組) Kind=3:窗口擴大因子(4位元組) Kind=8:時間戳(10位元組)
三、TCP的超時和重傳
對於每個TCP連接,TCP管理4個不同的定時器。
(1) 重傳定時器用於當希望收到另一端的確認。
(2) 堅持定時器使窗口大小信息保持不斷流動,即使另一端關閉了其接收窗口。
(3) 保活定時器可檢測到一個空閑連接的另一端何時崩潰或重啟。
(4) 2MSL定時器測量一個連接處於TIME_WAIT狀態的時間。
1、往返時間測量
TCP超時和重傳重最重要的就是對一個給定連接的往返時間(RTT)的測量。由於路由器和網路流量均會變化,因此TCP應該跟蹤這些變化並相應地改變超時時間。首先TCP必須測量在發送一個帶有特別序號地位元組和接收到包含該位元組地確認之間的RTT。
2、擁塞避免演算法
該演算法假定由於分組收到損壞引起的丟失是非常少的,因此分組丟失就意味著在源主機和目的主機之間的某處網路上發生了阻塞。有兩種分組丟失的指示:發生超時和收到重復的確認。擁塞避免演算法需要對每個連接維持兩個變數:一個擁塞窗口cwnd和一個慢啟動門限ssthresh。
(1) 對一個給定的連接,初始化cwnd為1個報文段,ssthresh為65535個位元組。
(2) TCP輸出常式的輸出不能超過cwnd和接收方通告窗口的大小。擁塞避免是發送方使用的流量控制。前者是發送方感受到的網路擁塞的估計,而後者則與接收方在該連接上的可用緩存大小有關。
(3) 當擁塞發生時,ssthresh被設置為當前窗口大小的一般(cwnd和接收方通告窗口大小的最小值,但最小為2個報文段)。此外,如果是超時引起了擁塞,則cwnd被設置為1個報文段。
(4) 當新的數據被對方確認時,就增加cwnd,但增加的方法依賴與是否正在進行慢啟動或擁塞避免。如果cwnd小於或等於ssthresh,則正在進行慢啟動,否則正在進行擁塞避免。
3、快速重傳和快速恢復演算法
如果我們一連串收到3個或以上的重復ACK,就非常可能是一個報文段丟失了。於是我們就重傳丟失的數據報文段,而無需等待超時定時器溢出。
(1) 當收到第3個重復的ACK時,將ssthresh設置為當前擁塞窗口cwnd的一半,重傳丟失的報文段,設置cwnd為ssthresh加上3倍的報文段大小。
(2) 每次收到另一個重復的ACK時,cwnd增加1個報文段大小並發送一個1個分組,如果允許的話。
(3)當下一個確認新數據的ACK到達時,設置cwnd為ssthresh,這個ACK應該時在進行重傳後的一個往返時間內對步驟1重重傳的確認。另外,這個 ACK也應該是對丟失的分組和收到的第一個重復的ACK之間的所有中間報文段的確認。
4、 ICMP差錯
TCP如何處理一個給定的連接返回的ICMP差錯。TCP能夠遇到的最常見的ICMP差錯就是源站抑制、主機不可達和網路不可達。
(1) 一個接收到的源站抑制引起擁塞窗口cwnd被置為1個報文段大小來發起慢啟動,但是慢啟動門限ssthresh沒有變化,所以窗口將打開直到它開放了所有的通路或者發生了擁塞。
(2) 一個接收到的主機不可達或網路不可達實際都被忽略,因為這兩個差錯都被認為是短暫現象。TCP試圖發送引起該差錯的數據,盡管最終有可能會超時。
5、重新分組:
當TCP超時並重傳時,它並不一定要重傳同樣的報文段,相反,TCP允許進行重新分組而發送一個較大的報文段。這是允許的,因為TCP是使用位元組序號而不是報文段序號來進行識別它所要發送的數據和進行確認。
四、TCP的堅持定時器
ACK的傳輸並不可靠,也就是說,TCP不對ACK報文段進行確認,TCP只確認那些包含數據的ACK報文段。為了防止因為ACK報文段丟失而雙方進行等待的問題,發送方用一個堅持定時器來周期性地向接收方查詢。這些從發送方發出地報文段稱為窗口探查。
五、TCP的保活定時器
如果一個給定的連接在2小時內沒有任何動作,那麼伺服器就向客戶發送一個探查報文段。客戶主機必須處於以下4個狀態之一。
(1) 客戶主機依然正常運行,並從伺服器可達。客戶的TCP響應正常,而伺服器也知道對方的正常工作的。伺服器在2小時內將保活定時器復位。
(2) 客戶主機已經崩潰,並且關閉或者正在重新啟動。在任何一種情況下,客戶的TCP都沒有響應。伺服器將不能收到對探查的響應,並在75秒後超時。總共發送10個探查,間隔75秒。
(3) 客戶主機崩潰並已經重新啟動。這是伺服器將收到一個對其保活探查的響應,但這個響應是一個復位,使得伺服器終止這個連接。
(4) 客戶主機正常運行,但是從伺服器不可達。
六、TCP的一些性能
1、 路徑MTU發現:
TCP的路徑MTU發現按如下方式進行:在連接建立時,TCP使用輸出介面或對段聲明的MSS中的最下MTU作為其實的報文段大小。路徑MTU發現不允許TCP超過對端聲明的MSS。如果對端沒有指定一個MSS,則默認為536。
一旦選定了起始的報文段大小,在該連接上的所有被TCP發送的IP數據報都將被設置DF位。如果中間路由器需要對一個設置了DF標志的數據報進行分片,它就丟棄這個數據報,並產生一個ICMP的「不能分片」差錯。
如果收到這個ICMP差錯,TCP就減少段大小並進行重傳。如果路由器產生的是一個較新的該類ICMP差錯,則報文段大小被設置位下一跳的MTU減去 IP和TCP的首部長度。如果是一個較舊的該類ICMP差錯,則必須嘗試下一個可能的最小MTU。
2、 長肥管道
一個連接的容量=帶寬X時延(RTT)。具有大的帶寬時延乘積的網路稱為長肥網路(LFN)。一個運行在LFN的TCP連接稱為長肥管道。管道可以被水平拉長(一個長的RTT),或被垂直拉高(較高的帶寬),或兩個方向拉伸。
3、窗口擴大選項:
窗口擴大選項使TCP的窗口定義從16位增加到32位,這並不是通過修改TCP首部來實現的,TCP首部仍然使用16位,而是通過定義一個選項實現對16位的擴大操作來完成的。
4、時間戳選項:
時間戳選項使發送方在每個報文段中放置一個時間戳值。接收方在確認中返回這個數值,從而允許發送方為每一個收到的ACK計算RTT。