004-Tcp
Posted hhj-study-10years
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了004-Tcp相关的知识,希望对你有一定的参考价值。
1.TCP 客户端每次和服务器通信之前,必须建立链接,所以一个链接只能维持一次通信
2.让链接过程中可能产生阻塞的部分不要在一个线程/进程中
TCP 客户端实现流程:
创建 socket
连接服务器 connect()
向服务器发送数据 send()
接收服务器返回的数据 recv()
关闭连接 close()
[一处阻塞 : recv()]
TCP 服务器端实现流程:
创建 socket
绑定端口 bind()
设置监听 listen()
接收客户端请求 accept() ---> 产生一个新的 socket
接收客户端发送的数据 recv()
返回数据给客户端 send()
关闭子 socket ---> accept() 产生的
[两处阻塞 : accept(),recv()]
TCP 传输协议中服务器端接收到客户端请求后的执行过程:
服务器端接收到客户端请求之前(accept()之前),一直处于阻塞状态。
服务器端收到客户端请求后, accept() 到客户端的 ip 和 port, 并返回一个新的 socket 对象来服务客户端,用完一定要关闭新的 socket 对象
调用新 socket 对象的 recv() 方法后 (recv()之前新 socket 对象也一直处于阻塞状态), 真正得到了客户端的发送内容
代码如下:
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server.bind(("",36007))
tcp_server.listen(128)
# 1. 在此之前一直阻塞
new_tcp_socket, ip_port = tcp_server.accept()
# 3. 真正得到了客户端发送的内容(收到内容前也会阻塞)
content_from_client = new_tcp_socket.recv(1024)
new_tcp_socket.close()
TCP 注意点:
1.TCP 服务器端一般都需要绑定端口,否则客户端无法访问服务器
2.服务器端通过 listen() 可以将创建好的 socket 由主动变成被动,服务器端必须这么做
3.关闭 listen() 后的 socket 意味着从被动变为主动,不再接受客户端的请求,但关闭之前已经连接成功的请求还会正常执行
4.TCP 通信一定要先建立链接,而 UDP 不需要建立链接就可以通信
5.当一个客户端连接服务器端时,服务器端会产生一个新的 socket,该套接字会标记这个客户端(通过 ip port),并单独为该客户端服务
6.当关闭 accept() 返回的 socket 时,意味着这个客户端已经服务完毕
7.当客户端的 socket 调用 close() 后,服务器端会 recv 解阻塞,并且返回长度为 0 ,因此服务器端可以通过判断 recv 返回的长度来判断客户端是否下线
TCP 的三次握手:
四次挥手:
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送。
(4)第四次挥手:Client收到FIN后,接着发送一个ACK给Server,确认序号为收到序号+1。
以上是关于004-Tcp的主要内容,如果未能解决你的问题,请参考以下文章