浅谈TCP/IP的服务端和客户端的工作原理

**

浅谈TCP/IP的服务端和客户端的工作原理

**TCP/IP协议集和OSI层

TCP通信流程图

本人作为一个初学者,在这里只谈谈自己的一点点小理解。

服务端

第一
套接字的创建,其实有了解过udp的人应该知道这两者在一些方面还是差不多的,你需要创建一个socket()对象 并且这是客户端和服务端都需要的第一步。
第二
服务端需要去绑定本机IP和端口(bind())
第三
listen监听模式,等待接收用户的链接,使得套接字变成被动状态
第四
accept处理用户链接 你需要去创建一个新的套接字来服务客户端
并且你会得到客户端的IP和端口
example代码 tcp_server_client,client_addressinfo=tcp_server.accept()
第五
通过新创建的套接字进行数据的收发工作
tcp_rec= tcp_server_client.recv(1024)
tcp_server_client.send(response.encode())
关注这两行代码的send和recv就可以了
第六
销毁套接字,注意 销毁的是在新创建的socket()

客户端

第一
同样是一个套接字的创建
第二
使用connect链接服务端
第三
收发数据
第四
销毁套接字
看起来这两个交互是挺简单的,其中还是比较复杂的。比如说:
三次握手
在这里插入图片描述
三次握手简单的讲,就是客户端和服务端相互确认对方身份信息。
第一握手:客户端会发送一个SYN位码(tcp标志码)给服务端,服务端接收到客户端的SYN位码,会向客户端发出一个SYN位码和一个ACK位码。客户端接收到之后再发送一次ACK位码。至此三次发送位码之后 双方确认身份,就可以开始资源的交互。
位码即tcp标志位,有6种标示:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
四次挥手

四次挥手 我的理解是 就是对资源交换的检查,检查资源是否交换彻底
客户端首先对服务端发送FIN位码和ACK位码,请求关闭,服务端接收到之后
状态变成close_wait并向客户端发送一个ACK位码,等待资源交互结束后发送一个FIN位码,客户端接送到之后最后发送一次ACK位码确认关闭。

import socket
#todo  创建套接字
tcp_server = socket.socket()

#todo 绑定端口
tcp_server.bind(('',8080))
#todo 监听
tcp_server.listen()

#todo 等待同意
tcp_server_client,client_addressinfo=tcp_server.accept()
print(tcp_server_client)
print(client_addressinfo)
#todo 收发资源
#
tcp_rec= tcp_server_client.recv(1024)
tcp_rec_data=tcp_rec.decode();
data_list=tcp_rec_data.split('\r\n')
first_line =data_list[0]
first_line_list=first_line.split(' ')
path = first_line_list[1]
print('请求路径是:',path)
# todo 根据请求的路径发送正确的资源给客户端
if path == '/index':
    returndata = 'this is a index'
elif path == '/pic':
    returndata = 'this is a pic'
    #todo 按照正确的格式拼接响应报文
response_first_line = 'HTTP/1.1 200 OK \r\n'
responseheader = response_first_line + '\r\n'
response = responseheader + returndata
print(response)
    #todo 将数据发送给客户端
tcp_server_client.send(response.encode())
#todo 销毁
tcp_server_client.close()

这里是一个我自己写的服务端的代码。我用网页测试了一下。发现用127.0.0.1和用localhost会输出不一样的答案,前者会顺利运行,后者则会输出 response is not defind 如果有大佬看到 麻烦帮忙解答一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值