tcp 三次握手,四次挥手
生活随笔
收集整理的這篇文章主要介紹了
tcp 三次握手,四次挥手
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三次握手:
在用 tcp 傳輸數據時,需要先建立連接,用三次握手建立傳輸數據的連接通道
其實是服務端端和客戶端各自都在準備資源。
- 第一次握手:客戶端向服務器發送連接請求包,標志位 SYN (同步序號)置為 seq = X;
- 第二次握手:服務器收到客戶端發過來的報文,由 SYN = X 知道客戶端要求建立聯機,向客戶端發送一個包含 SYN 和 ACK 的 TCP 報文,其中服務器向客戶端發送連接請求包,標志位 SYN (同步序列)置為 Y=1;將確認序號(ACK)設置為客戶的序列號加 1,即 X + 1
- 第三次握手:客戶端收到服務器發來的包后檢查確認序號(ACK)是否正確,即第一次發送的序號加1(X+1);若正確,服務器再次打算確認序號(ACK) = Y+1;服務器收到確認序號值 ACK=2 則連接成功,可以傳送數據了。
四次揮手:
- 第一次揮手:客戶端給服務器發送 TCP 包,用來關閉客戶端到服務器的數據傳送,將標志位 FIN 置為 X 和 ACK 置為 Y ;
- 第二次揮手:服務器收到 FIN 后,返回一個 ACK(標志位ACK=1)確認序號為收到的序號加1,即 X+1
- 第三次揮手:服務器關閉與客戶端的連接,發送一個 FIN,標志位 FIN和 ACK 置為1,序號為 Y
- 第四次揮手:客戶端收到服務器發送的 FIN 之后,發回 ACK 確認,確認序號為收到的序號加1,即Y+1,服務器手機 ACK 為 Y+1 后關閉
在第二次和第三次、第三次和第四次之間會有超時等待。
""" 一個簡單的http服務器 創建http服務器, tcp """ import socket import redef service_client(client_socket):"""實現接收消息和發送消息"""# 接收客戶發送過來的請求request = client_socket.recv(1024).decode("utf-8")print(">>>" * 20)print(request)# 將客戶端的請求變成列表request_lines = request.splitlines()print(request_lines)# 使用正則取出客戶端請求的數據名稱# 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("客戶端請求的數據是 %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()# 根據客戶需求回送數據過去response_status_line = "HTTP/1.1 200 OK\r\n" # response status line 響應狀態行 HTTP 必須大寫 換行是\r\nspace_line = "\r\n" # 響應頭和響應的數據之間有個空行response_body = html_content # 發送的內容response_header = response_status_line + space_lineclient_socket.send(response_header.encode("utf-8")) # 注意:響應頭是str格式,需要編碼client_socket.send(response_body) # 響應的內容需要是字節模式,不需要進行編碼發送,瀏覽器會自動解析# 關閉這個套接字client_socket.close()def main():# 創建服務器的套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 可以讓端口重復使用# 綁定本地信息tcp_server_socket.bind(("", 8888)) # 地址信息放在元組中# 將套接字變為監聽tcp_server_socket.listen() # 最大的客戶端鏈接數為128while True:# 等待客戶端鏈接# 如果有客戶端鏈接,會返回元組,第一個元素是一個新的套接字專為這個客戶端服務,第二個元素是客戶端地址信息new_socket, client_addr = tcp_server_socket.accept()# 循環和客戶的進行通信service_client(new_socket)# 關閉監聽套接字tcp_server_socket.close()if __name__ == '__main__':main()總結
以上是生活随笔為你收集整理的tcp 三次握手,四次挥手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业如何避免创新者的窘境
- 下一篇: 从VC6到VC9移植代码问题总结