udp与tcp的区别,以及tcp的三次握手,四次挥手

udp与tcp的区别

TCP通信同UDP通信区别在于,UDP中只有发送端和接收端不区分客户端与服务器端,计算机之间可以任意地发送数据。而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

udp: A ----发送数据给 ------》B ,A发送完之后,A并不知道B收到数据了没, 类比如 以前发送邮件(信件?)

tcp: A ----发送数据给 ------》B, A发送完之后,A能确定B收到了没。因为tcp会经历三次握手确立A-B与已经相互连接,类比如打电话,先要拨通号码(A,B双方都知道电话已经联通),才能进行通话

1.三次握手 确立连接

从 tcp_socket.connect(server_addr)开始

C(client)向S(server)发送一个数据11,S将数据加一返回12给C,这样就确立服务器可以安全传输数据的连接

S(server)向C(client)发送一个数据44,C将数据加一返回45给S,这样就确立客户端可以安全传输数据的连接

为了加快数据的传输,将第二步与第三步和为一步,即向C发送加1的数据,也同时发送S数据给C,测试C的连接

SYN: 标记请求

ACK: 标记应答

2.四次挥手 关闭连接

socket套接字是全双工的,同时可以收发数据,有两个通道,一个是收的,一个是发的。将来要关的时候,必须两个通道全关闭

通过recv()解堵塞,和recv()没接受数据,来确定client发数据通道关闭,然后关闭S端close

    if request_data:
        print(request_data)
    else:
        new_client_socket.close()
从 tcp_socket.close() 开始。

aa

疑问1:为什么这里的2,3步为什么不能合并,为什么四次握手,改成三次握手,而这里不行呢?

这里的第三步为执行服务器端调用的close(),关闭发数据通道, 但这里并不能保证close()什么时候调用,如果将第二步的返回应答包和第三步合并,那么应答包也为受到close()延迟调用的影响,浪费时间,影响速度。因此它分成了两次

疑问2:为什么要让客户端先调用close,而不是服务器端先调用close呢?

tcp为了保存数据的可靠性,一般, 收到一个数据,接受方会给发送方回一个确认包数据确认,那么接受方怎么知道发送方到底有没有接受到确认包,这里就涉及到tcp的数据可靠性传输问题了。谁最后调用的close,谁就设置一个超时时间,如果在这个超时时间内,没有收到对方发来的确认包,那么将会再重发一次,如果确认包传输过程(一般为2分钟内)中超过个这个超时时间,那么S端将再发一份close相关数据,但C端已经发送了确认包,且将资源已经释放了,那么C端将再发送一份确认包,那么就有两份确认包发送给S端了,这样就会发送确认冲突,解决的办法就是谁先调用close,谁的资源就会先保留2分钟,两分钟的期间之内资源(比如端口)不允许重复使用,那么C中有记录已经发送了一份确认包,那么不会继续再发送一份确认包了,会重新开始,S端发送close信息,D端在超时时间之内接受到了C端发送的确认包,那么断开连接确立。

如果是服务器端先调用的close,那么就会出现Address already in use端口被占用的问题的问题

解决办法就是设置套接字选项

# 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定8080端口
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值