tcp 三次握手,四次挥手
生活随笔
收集整理的這篇文章主要介紹了
tcp 三次握手,四次挥手
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
三次握手:
在用 tcp 傳輸數(shù)據(jù)時,需要先建立連接,用三次握手建立傳輸數(shù)據(jù)的連接通道
其實(shí)是服務(wù)端端和客戶端各自都在準(zhǔn)備資源。
- 第一次握手:客戶端向服務(wù)器發(fā)送連接請求包,標(biāo)志位 SYN (同步序號)置為 seq = X;
- 第二次握手:服務(wù)器收到客戶端發(fā)過來的報(bào)文,由 SYN = X 知道客戶端要求建立聯(lián)機(jī),向客戶端發(fā)送一個包含 SYN 和 ACK 的 TCP 報(bào)文,其中服務(wù)器向客戶端發(fā)送連接請求包,標(biāo)志位 SYN (同步序列)置為 Y=1;將確認(rèn)序號(ACK)設(shè)置為客戶的序列號加 1,即 X + 1
- 第三次握手:客戶端收到服務(wù)器發(fā)來的包后檢查確認(rèn)序號(ACK)是否正確,即第一次發(fā)送的序號加1(X+1);若正確,服務(wù)器再次打算確認(rèn)序號(ACK) = Y+1;服務(wù)器收到確認(rèn)序號值 ACK=2 則連接成功,可以傳送數(shù)據(jù)了。
四次揮手:
- 第一次揮手:客戶端給服務(wù)器發(fā)送 TCP 包,用來關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送,將標(biāo)志位 FIN 置為 X 和 ACK 置為 Y ;
- 第二次揮手:服務(wù)器收到 FIN 后,返回一個 ACK(標(biāo)志位ACK=1)確認(rèn)序號為收到的序號加1,即 X+1
- 第三次揮手:服務(wù)器關(guān)閉與客戶端的連接,發(fā)送一個 FIN,標(biāo)志位 FIN和 ACK 置為1,序號為 Y
- 第四次揮手:客戶端收到服務(wù)器發(fā)送的 FIN 之后,發(fā)回 ACK 確認(rèn),確認(rèn)序號為收到的序號加1,即Y+1,服務(wù)器手機(jī) ACK 為 Y+1 后關(guān)閉
在第二次和第三次、第三次和第四次之間會有超時等待。
""" 一個簡單的http服務(wù)器 創(chuàng)建http服務(wù)器, tcp """ import socket import redef service_client(client_socket):"""實(shí)現(xiàn)接收消息和發(fā)送消息"""# 接收客戶發(fā)送過來的請求request = client_socket.recv(1024).decode("utf-8")print(">>>" * 20)print(request)# 將客戶端的請求變成列表request_lines = request.splitlines()print(request_lines)# 使用正則取出客戶端請求的數(shù)據(jù)名稱# request_lines = ['GET /images/trolltech-logo.png HTTP/1.1', 'Host: 127.0.0.1:8888']# 從中取出 /images/trolltech-logo.pngret = re.match(r"[^/]+(/[^ ]*) HTTP/1.1", request_lines[0])client_request = ""if ret:print("客戶端請求的數(shù)據(jù)是 %s" % ret.group(1))client_request = ret.group(1)if client_request == "/":client_request = "/index.html"try:f = open("./html%s" % client_request, "rb")except:response_status_line = "HTTP/1.1 404 NOT FOUNT\r\n"space_line = "\r\n"response_header = response_status_line + space_lineresponse_body = "<h1>FILE NOT FOUND</h1>".encode("utf-8")else:html_content = f.read()f.close()# 根據(jù)客戶需求回送數(shù)據(jù)過去response_status_line = "HTTP/1.1 200 OK\r\n" # response status line 響應(yīng)狀態(tài)行 HTTP 必須大寫 換行是\r\nspace_line = "\r\n" # 響應(yīng)頭和響應(yīng)的數(shù)據(jù)之間有個空行response_body = html_content # 發(fā)送的內(nèi)容response_header = response_status_line + space_lineclient_socket.send(response_header.encode("utf-8")) # 注意:響應(yīng)頭是str格式,需要編碼client_socket.send(response_body) # 響應(yīng)的內(nèi)容需要是字節(jié)模式,不需要進(jìn)行編碼發(fā)送,瀏覽器會自動解析# 關(guān)閉這個套接字client_socket.close()def main():# 創(chuàng)建服務(wù)器的套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 可以讓端口重復(fù)使用# 綁定本地信息tcp_server_socket.bind(("", 8888)) # 地址信息放在元組中# 將套接字變?yōu)楸O(jiān)聽tcp_server_socket.listen() # 最大的客戶端鏈接數(shù)為128while True:# 等待客戶端鏈接# 如果有客戶端鏈接,會返回元組,第一個元素是一個新的套接字專為這個客戶端服務(wù),第二個元素是客戶端地址信息new_socket, client_addr = tcp_server_socket.accept()# 循環(huán)和客戶的進(jìn)行通信service_client(new_socket)# 關(guān)閉監(jiān)聽套接字tcp_server_socket.close()if __name__ == '__main__':main()總結(jié)
以上是生活随笔為你收集整理的tcp 三次握手,四次挥手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业如何避免创新者的窘境
- 下一篇: SPI协议详解(图文并茂+超详细)