TCP建立一個連接需要3個分節(jié),終止一個連接需要4個分節(jié)卢肃。
(1)某個應(yīng)用進程首先調(diào)用close,我們稱該端執(zhí)行主動關(guān)閉(active close)莫湘。該 端的TCP于是發(fā)送一個FIN分節(jié)幅垮,表示數(shù)據(jù)發(fā)送完畢。
(2)接收到這個FIN的對端執(zhí)行被動關(guān)閉(passive close)忙芒。這個FIN由TCP確認呵萨。它的接收也作為一個文件結(jié)束符(end-of-file)傳遞給接收端應(yīng)用進程(放在已排隊等候該應(yīng)用進程接收的任何其他數(shù)據(jù)之后),因為FIN的接收意味著接收端應(yīng)用進程在相應(yīng)連接上再無額外數(shù)據(jù)可接收囱皿。
(3)一段時間后忱嘹,接收到這個文件結(jié)束符的應(yīng)用進程將調(diào)用close關(guān)閉它的套接字。這導(dǎo)致它的TCP也發(fā)送一個FIN爹橱。
(4)接收這個最終FIN的原發(fā)送端TCP(即執(zhí)行主動關(guān)閉的那一端)確認這個FIN窄做。
既然每個方向都需要一個FIN和一個ACK,因此通常需要四個分節(jié)组砚。我們使用限定詞“通程图眨”是因為:某些情況下步驟1的FIN隨數(shù)據(jù)一起發(fā)送;另外乌叶,步驟2和步驟3發(fā)送的分節(jié)都出自執(zhí)行被動關(guān)閉那一端准浴,有可能被合并成一個分節(jié)。
類似SYN求橄,一個FIN也占據(jù)一個字節(jié)的序列號空間。因此条霜,每個FIN的ACK確認號就是這個FIN的序列號加1.
在步驟2于步驟3之間涵亏,從執(zhí)行被動關(guān)閉一端到執(zhí)行主動關(guān)閉一端流動數(shù)據(jù)是可能的。這稱為半關(guān)閉(half-close)
當(dāng)套接字被關(guān)閉時夹厌,其所在端TCP各自發(fā)送了一個FIN裆悄。我們在圖中指出,這是由應(yīng)用進程調(diào)用close而發(fā)生的或南,不過需認識到艾君,當(dāng)一個Unix進程無論自愿地(調(diào)用exit或從main函數(shù)返回)還是非自愿地(收到一個終止本進程的信號)終止時,所有打開的描述符都被關(guān)閉蹬癌,這也導(dǎo)致仍然打開的任何TCP連接也發(fā)生一個FIN虹茶。
上圖展示了客戶執(zhí)行主動關(guān)閉的情形,不過我們指出董济,無論是客戶還是服務(wù)器要门,任何一端都可以執(zhí)行主動關(guān)閉。通常情況是客戶執(zhí)行主動關(guān)閉封豪,但是某些協(xié)議(譬如值得注意的HTTP/1.0)卻由服務(wù)器執(zhí)行主動關(guān)閉炒瘟。