网络传输方式——TCP

TCP概念

TCP:英文全称(Transmission Control Protocol)简称传输控制协议,他是一种面向连接的,可靠的,基于字节流的传输层技术协议。

特点:

1)面向连接
2)可靠传输:采用应答机制,超时重传,错误校验,流量控制和阻塞管理。
3)可靠,稳定,适合大数据传输,但是传输速度慢,占用系统资源高。

TCP客户端代码

import  socket


#创建socket套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_ip = ""
server_port = 8080
# 设置连接
tcp_client_socket.connect((server_ip,server_port))
# 设置发送的数据
send_data = ''
# 发送数据
tcp_client_socket.send(send_data.encode('gbk'))
# 接受对方发送的数据
recv_data = tcp_client_socket.recv(1024)
# 解码
recv_content = recv_data.decode('gbk')
# 关闭套接字
tcp_client_socket.close()

tcp服务端代码

import socket

# 创建socket套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 设置本地信息
address = ('',8080)
# 设置绑定
tcp_server_socket.bind(address)
# 设置监听,使用socket设置的套接字默认的属性是主动的,使用listen将其设置为被动的,这样就可以接受别人的连接了.128表示最大连接等待数,服务端只能一个服务一个客户端,会堵塞在accept处等待,服务一个完成后,才会链接下一个。
tcp_server_socket.listen(128)
# 如果有新的链接请求来连接服务器,那么就产生一个新的套接字为他服务.client_socket用来为这个客户服务,tcp_server_socket就可以为别的客户服务了
client_socket,client_addr = tcp_server_socket.accept()
# 接受发送过来的数据
recv_data = client_socket.recv(1024)
# 发送一些数据到客户端
client_socket.send('thankyou'.encode('gbk'))
# 关闭套接字
client_socket.close()
# 关闭总套接字
tcp_client_socket.close()

TCP注意点:

tcp服务器一般情况下都需要绑定端口号,否则客户端找不到这个服务器
tcp客户端一般不绑定端口号,使用随机生成的端口号即可
当tcp客户端和服务端建立好连接才可以收发数据,udp是不需要建立连接,直接就可以发送数据
当一个tcp客户端和服务端连接成功后,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
关闭accept返回的套接字意味着这个客户端已经服务完毕
当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

TCP的三次握手和四次挥手

在这里插入图片描述

解释:
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

在这里插入图片描述
说明:

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送。
第四次挥手:Client收到FIN后,接着发送一个ACK给Server,确认序号为收到序号+1。

猜你喜欢

转载自blog.csdn.net/weixin_43617255/article/details/84780683
今日推荐