TCP通信详解
一、TCP简介
1.TCP介绍
a>TCP协议:TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为:TCP)是一种面向连接的、可靠的、基于字节流的通信协议
1.面向连接:先连接,再通信,好比打电话模型
2.可靠的,相对于UDP,TCP传输更可靠,TCP通过一序列的机制(面向连接机制、发送应答机制)来保障传输的可靠性
3.基于字节流的,UDP创建UDP socket——DGRAM:基于数据报通信方式,每一次发送的数据都是一个独立的整体,包含目标主机的ip地址、端口号及发送数据的内容
b>TCP通信的三个步骤
基于面向连接的:1.与服务端建立连接
2.收发数据
3.关闭连接
2.TCP特点
a>面向连接
1.先建立连接,再进行通信
2.TCP连接是一对一的,而UDP可以一对一或一对多,UDP适合做广播程序
a>可靠传输:通过一序列机制来保障TCP传输数据比UDP更可靠
1.传送应答机制
2.超时重传机制
3.错误校验
4.流量控制/阻塞管理
3.TCP与UDP的不同点
1.面向连接
2.有序数据传输
3.重发丢失的数据包
4.丢弃重复的数据包
5.无差错的数据传输
6.阻塞/流量控制
4.TCP与UDP的应用场景
1.TCP的应用场景:适合通信质量要求较高的场景,http传输、文件传输、smtp等等,目前大部分的传输都是基于TCP协议传输
2.UDP的应用场景:相对于TCP传输,UDP传输速度更快,实时性更好,耗资源更少,但稳定性、可靠性比TCP差,适合对网络通讯质量要求不高,速度要求尽量快,更实时,比如QQ语音,QQ视频
5.UDP与TCP的通信模型
a>UDP通信模型
面向无连接,好比写信模型,没有严格的服务端与客户端之分
b>TCP通信模型
面向连接的,好比打电话模型,有严格的服务端与客户端之分
二、TCP网络程序-客户端(重点)
1、TCP客户端实现流程
1、创建一个TCP的socket对象
2、与TCP服务端建立连接
3、使用TCP socket 收发数据
4、关闭连接
参考代码如下:
三、TCP网络程序-服务端(重点)
1.TCP服务端创建流程:
1、创建服务端的server_socket,用于监听客户端的请求
2、绑定端口
3、server_socket开启监听,有主动连接改变为被动连接模式
4、假如有客户端的请求,则立即接收,且创建一个与客户端对接的socket,与客户端进行通信
5、使用新创建的socket与客户端通信
6、关闭与客户端通信的socket,当该socket被关闭,则不再与当前客户端通信
7、关闭用于监听客户端发送请求的socket,当该socket关闭,则不再接收新的客户端请求
参考代码如下:
2、同时为多个客户端提供服务:
参考代码如下:
4、为同一个客户端提供多次服务
参考代码如下:
四、TCP注意点:
tcp服务端一般情况下都需要绑定,否则客户端找不到这个服务端
tcp客户端一般不绑定,因为是主动连接服务端,所以只要确定好服务端的ip、port等信息就好,本地客户端可以随机
tcp服务端中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务端时必须要做的
当客户端需要连接服务端时,就需要使用connect进行连接,udp是不需要连接的而是直接发送,但是tcp必须先连接,只有连接成功才能通信
当一个tcp客户端连接服务端时,服务端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
listen后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept返回的新套接字是标记这个新客户端的
关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够连接服务端,但是之前已经连接成功的客户端正常通信。
关闭accept返回的套接字意味着这个客户端已经服务完毕
当客户端的套接字调用close后,服务端会recv解堵塞,并且返回的长度为0,因此服务端可以通过返回数据的长度来区别客户端是否已经下线
五、三次握手、四次挥手(了解)
a> 三次握手
第一次握手: 客户端A向服务端B发送连接请求(客户端–>服务端方向)
第二次握手: 服务端B向客户端A发送确认连接,同时向客户端A发送连接请求(服务端–>客户端方向)
第三次握手: 客户端A收到服务端的确认信息,正确无误后,再向客户端发送确认连接信息(客户端–>服务端方向)
b> 四次挥手
六、 服务器如何复用同一个端口而不会提示端口被占用
“””
socket.setsockopt(level,option,value) :配置socket
level:等级,对哪个等级操作(ip,tcp,udp,socket等级)
option:设置哪个选项
socket.SO_REUSEADDR: 复用地址
value: True:表示复用,False,表示不复用
“””
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 提示:socket.setsockopt()方法要在 socket.bind()之前设置
七、案列:文件下载器
a>客户端实现:
“”“文件下载器客户端实现流程
1、创建一个TCP socket
2、连接服务端
3、获取用户输入的文件名
4、把要下载的文件名发给服务端
5、等待接收服务端回传的文件内容
6、假如内容不为空,则写入到文件中
7、关闭TCP socket
”“”
参考代码如下:
b>服务端实现
“”” 文件下载服务端实现流程
1. 创建服务端的socket,用来做监听的
2. 绑定端口
3. 开启监听 listen
4. 循环接收客户端的下载请求
5. 获取客户端发送过来的要下载的文件名
6. 通过函数取得要下载的文件的内容
7. 把内容回传给客户端
8. 关闭与客户端对接的socket
9. 关闭服务端server_socket,不再接收新的下载文件的请求
“””
参考代码如下: