真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

http中如何建立TCP連接

本篇文章為大家展示了http中如何建立TCP連接,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)專(zhuān)注于保山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供保山營(yíng)銷(xiāo)型網(wǎng)站建設(shè),保山網(wǎng)站制作、保山網(wǎng)頁(yè)設(shè)計(jì)、保山網(wǎng)站官網(wǎng)定制、小程序定制開(kāi)發(fā)服務(wù),打造保山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供保山網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

1. 建立TCP連接

1.1 TCP 服務(wù)端與客戶(hù)端

web服務(wù)的本質(zhì),是一個(gè)TCP server, 瀏覽器則是一個(gè)TCP client。圖3中黃色的部分就是建立TCP連接,只有先建立連接,瀏覽器才能通過(guò)這個(gè)連接發(fā)送http請(qǐng)求。你可能注意到,我直接越過(guò)了DNS解析,直接講解第2部分內(nèi)容,這是因?yàn)楸仨毾壤斫釺CP連接,才能理解DNS解析。
下面的代碼是一份TCP 服務(wù)端的示例
import socket

# 指定協(xié)議
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 讓端口可以重復(fù)使用
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 綁定ip和端口
server.bind(('0.0.0.0', 8080))
# 監(jiān)聽(tīng)
server.listen(1)
# 等待消息
clientsocket, address = server.accept()
# 接收消息
data = clientsocket.recv(1024)
# 關(guān)閉socket
clientsocket.close()
server.close()

客戶(hù)端代碼的編寫(xiě)也十分容易

import socket
import time


host = '127.0.0.1'
port = 8081
addr = (host, port)
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 連接server
client.connect(addr)
# 向server發(fā)送數(shù)據(jù)
client.send(b'I am client')
# 接收server返回的數(shù)據(jù)
revcdata = client.recv(1024)
# 收到的數(shù)據(jù)都是bytes類(lèi)型
print(revcdata.decode(encoding='utf-8'))
time.sleep(1)
client.close()

建立TCP的過(guò)程,有一個(gè)重要的概念---3次握手。這個(gè)問(wèn)題經(jīng)常在面試中被用來(lái)考察應(yīng)聘者對(duì)于socket的了解程度。

1.2 什么是TCP3次握手

客戶(hù)端與服務(wù)端在建立正是的連接之前,要互相試探著詢(xún)問(wèn)對(duì)方是否愿意與自己建立連接

http中如何建立TCP連接

上面所畫(huà)的,闡述的是一種十分簡(jiǎn)單的理解,只是對(duì)功能進(jìn)行了描述,并沒(méi)有從技術(shù)層面上解答何為tcp3次握手,而想要從技術(shù)層面上做出解釋?zhuān)瑒t必須先了解TCP頭結(jié)構(gòu)
下圖是TCP頭結(jié)構(gòu),客戶(hù)端與服務(wù)端發(fā)送數(shù)據(jù)時(shí),必須準(zhǔn)守TCP/IP協(xié)議,按照指定的格式發(fā)送數(shù)據(jù),TCP的頭結(jié)構(gòu)攜帶了許多關(guān)鍵信息,比如源端口號(hào)與目的端口號(hào)

http中如何建立TCP連接

注意看上圖中,中間白色的那一塊區(qū)域,找到SYN和ACK,這兩個(gè)各占1個(gè)bit位,是3次握手的關(guān)鍵:
  1. 客戶(hù)端向服務(wù)端發(fā)送syn包,所謂的syn包,是指SYN為1

  2. 服務(wù)端收到syn包以后,發(fā)送syn+ack包,這時(shí),SYN和ACK都是1

  3. 客戶(hù)端向服務(wù)端發(fā)送ACK包,ACK標(biāo)識(shí)位是1

這便是TCP建立連接時(shí)的3次握手

http中如何建立TCP連接

1.3 為什么是3次握手,而不是2次

看上去,似乎兩次握手就可以了,服務(wù)端在收到SYN包后回復(fù)ACK確認(rèn)可以建立連接不就行了么,為何非要讓服務(wù)端也發(fā)SYN,客戶(hù)端再回ACK呢?
之所要求3次握手,是為了防止已經(jīng)失效的SYN包意外的到達(dá)服務(wù)端,造成雙方的不一致。
考慮這種情況,客戶(hù)端向服務(wù)端發(fā)出了SYN包S1, 可好巧不巧的是,S1由于網(wǎng)絡(luò)阻塞或其他原因在網(wǎng)絡(luò)中滯留,畢竟從客戶(hù)端到服務(wù)器隔著十萬(wàn)八千里呢,中間是好多個(gè)交換機(jī)路由器等網(wǎng)絡(luò)設(shè)備,網(wǎng)絡(luò)也會(huì)堵車(chē)。發(fā)生網(wǎng)絡(luò)堵車(chē)后,客戶(hù)端以為S1丟包了,于是又發(fā)出一個(gè)SYN包S2,S2順利的到達(dá)服務(wù)端,如果握手只需要兩次,那么服務(wù)端回一個(gè)ACK就建立好連接了。
可別忘了網(wǎng)絡(luò)中還有一個(gè)S1,S1并不知道客戶(hù)端又發(fā)出了S2,它恪盡職守的穿越重重障礙,在S2之后到達(dá)服務(wù)端,如果這個(gè)時(shí)候S2所建立的連接還存在,那么服務(wù)端會(huì)無(wú)視S1,但如果S2所建立的連接已經(jīng)斷開(kāi)了呢?服務(wù)端會(huì)以為S1是一個(gè)新的連接請(qǐng)求,服務(wù)端回ACK,建立連接,客戶(hù)端收到ACK后,就有點(diǎn)懵逼了,它完全不知道是怎么回事,也不知道該如何處理這個(gè)突然到達(dá)的ACK包,這樣一來(lái),兩邊都會(huì)浪費(fèi)很多資源。
2次握手建立連接,會(huì)發(fā)生上述的意外,但是3次握手就不會(huì),服務(wù)端與客戶(hù)端都要發(fā)送SYN包并回復(fù)對(duì)方ACK包,只有這樣才會(huì)建立連接,服務(wù)端在回復(fù)ACK的時(shí)候,順帶著把SYN設(shè)置為1,這樣就免去了單獨(dú)發(fā)送SYN包的步驟,3次握手即可建立連接。

上述內(nèi)容就是http中如何建立TCP連接,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前題目:http中如何建立TCP連接
網(wǎng)址分享:http://weahome.cn/article/jpgoee.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部