TCP(Transmission Control Protocol傳輸控制協(xié)議)是一種面向連接的(端對端扁凛,不能1對多)、可靠的、基于字節(jié)流的傳輸層通信協(xié)議抚岗。
TCP首部:20B
TCP的六個標志位:
PSH:當PSH=1的時候扒寄,會立刻封裝發(fā)送出去鱼鼓;
RST:復(fù)位比特,表示需要重新建立連接该编;
SYN:同步比特迄本,當SYN = 1的時候听皿,向?qū)Ψ秸埱蠼⒁粋€鏈接晨仑,主要用于TCP三次握手童太,建立連接亩冬;
FIN:當FIN = 1時,請求終止TCP鏈接公条;
URG:緊急字段拇囊;
ACK:確認字段,對方返回確認ACK = 1靶橱。
以上6個標志位往往和首部其他字段配合使用寥袭。
接下來就步入正題。
TCP三次握手
所謂三次握手是指建立一個TCP連接時关霸,需要客戶端和服務(wù)器總共發(fā)送3個包传黄。
三次握手的目的是連接服務(wù)器指定端口,建立TCP連接队寇,并同步連接雙方的序列號和確認號并交換TCP窗口大小信息尝江。
當建立未開始的時候,C和S都處于CLOSED的狀態(tài)英上,接著S進入LISTEN狀態(tài)炭序,監(jiān)聽客戶端是否發(fā)送請求。
第一次握手苍日,客戶端發(fā)送SYN=1,Seq=X,表示客戶端請求建立連接惭聂,并將初始序列號X發(fā)送給服務(wù)器,客戶端進入SYN_SENT狀態(tài)相恃。
第二次握手辜纲,服務(wù)器端返回SYN=1,Seq=Y拦耐,ACK=1耕腾,ack=X+1,表示服務(wù)器端請求和客戶端建立連接杀糯,將初始序列號Y發(fā)送給客戶端扫俺;ACK=1是對客戶端請求建立連接的確認,ack = X+1是返回給客戶端的序列號(將客戶端的Seq=X加1)固翰。此時狼纬,服務(wù)器端進入SYN_RCVD狀態(tài)。
第三次握手骂际,客戶端發(fā)送Seq=X+1疗琉,ACK=1,ack=Y+1歉铝,表示客戶端確認連接盈简,再次發(fā)送序列號X+1,并返回Y+1;客戶端進入ESTABLISHED狀態(tài)柠贤。當服務(wù)器端收到后香浩,服務(wù)器端也進入ESTABLISHED狀態(tài)。
那么為什么是三次握手呢种吸?
三次就可以確認雙方都能正常接發(fā)消息弃衍。這就和打電話的道理是一樣的呀非,Ex:
“喂坚俗?你聽的到嗎?”?
?“我聽的到岸裙,你聽的到我嗎猖败?”?
?“我能聽得到你,今天……”
如果是兩次的話降允,可能會出現(xiàn)這種情況:
“喂恩闻?你聽的到嗎?”
“我聽的到”
“喂剧董?你聽的到嗎幢尚?”
“我聽的到”
如果是四次呢?
“喂翅楼?你聽的到嗎尉剩?”
“我聽的到,你聽的到我嗎毅臊?”
“我能聽得到你理茎,你能聽的到我嗎?”
“我不想和xx說話”
TCP四次揮手
目的是拆除連接管嬉,而拆除連接需要發(fā)送4個包皂林。客戶端和服務(wù)器均可主動發(fā)起揮手動作蚯撩。
第一次揮手础倍,客戶端發(fā)完數(shù)據(jù)后,向服務(wù)端發(fā)送FIN=1胎挎,序列號為X著隆,表示客戶端沒有數(shù)據(jù)要發(fā)送給服務(wù)器了,客戶端進入FIN_WAIT_1狀態(tài)呀癣。
第二次揮手美浦,服務(wù)器受到了客戶端的FIN報文段,向客戶端發(fā)送一個ACK=X+1確認项栏,表示“我同意你關(guān)閉”浦辨,接著客戶端進入FIN_WAIT_2狀態(tài)。
第三次揮手,服務(wù)器向客戶端發(fā)送FIN報文段流酬,請求關(guān)閉連接币厕,服務(wù)器進入LAST_ACK狀態(tài)。
第四次揮手芽腾,客戶端收到服務(wù)器的FIN報文旦装,返回ACK確認,客戶端進入TIME_WAIT狀態(tài)摊滔,服務(wù)器收到ACK關(guān)閉連接阴绢,此時客戶端等待2MSL之后沒有收到回復(fù),證明服務(wù)器正常關(guān)閉艰躺,然后客戶端關(guān)閉連接呻袭。
前兩次,客戶端關(guān)閉寫通道腺兴,不再發(fā)送數(shù)據(jù)左电,但可以接收數(shù)據(jù);服務(wù)器端關(guān)閉讀通道页响,仍可發(fā)送數(shù)據(jù)篓足。后兩次,客戶端關(guān)閉讀通道闰蚕,服務(wù)器關(guān)閉寫通道栈拖。可見陪腌,通過四次雙方成功關(guān)閉讀寫通道——關(guān)閉連接辱魁。
四次揮手還有雙方同時請求斷開連接的情況。感興趣的可以去查閱一下诗鸭。