计算机网络精炼笔记(二)应用层——Socket
文章目录
概述
TCP Socket 是一个整数,代表的是一个会话关系,对应一个进程(PID)
UDP Socket 是一个整数,代表本地的IP和端口
如果是多进程,可以有很多connection socket, 但只有一个welcome socket
一、TCP套接字编程
大致过程
1.服务器进程必须运行,创建一个欢迎socket,该socket和本地的端口进行捆绑,在欢迎socket上阻塞式的等待接收客户端的连接
2.客户端创建本地的套接字,隐式捆绑到本地的端口,再指定服务器的ip和端口进行连接。
3.服务器接受来自用户端的请求 ,解除阻塞式等待,返回一个 新的socket(与欢迎socket不 一样),与客户端通信
4.连接API调用有效时,客户端与服务器建立了TCP连接,即可以通信了
两个结构体
Socket_addr_in(Sad)
作用:IP地址和port捆绑关系的数据结构(进程的端节点)
- sin_family :不仅可以用于TCP/IP通信,还可以用于其他通信(IPX),因此需要标识
- sin_port : 端口号
- sin_addr : IP地址(32位) (从hsoet_id 的 addr_list 中复制过来)
- sin_zero[8] : 对齐作用
host_ent
作用:作为调用域名解析函数时的参数
- h_name 主机的域名
- h_aliases 主机的一系列的别名
- h_length 地址的长度
- h_addr_list 可能对应的不同IP地址的列表
编程过程
大写转小写的过程,Socket编程实现
server端:
1、weclome = Socket()
2、bind(welcome, Sad)
3、ConSock = accept(weclome) 阻塞状态
Client 端:
4、ClientSock = socket()
5、操作系统隐式的找一个没有用的port进行bind:bind(ClientSock, Cad)
6、Connect(ClientSocket, Sad)阻塞状态
Server端:
7、生成ConSock, 解除阻塞,记录Socket, 源&目的IP 五个值
Client端:
8、connect()解除阻塞,write(ClientSock, data)
Server端
9、Read()
10、Write()
Client端:
11、read()
Server端
12、close()关闭连接(删除表格中的记录ConSock),返回状态3
如此循环
代码(和上文的过程对应)
二、UDP编程
特点
- UDP传送的也是数据报datagram,和IP传送的数据报名字一样,但含义不同
- 在客户端和服务器之间没有连接,没有握手
- 发送端在每一个报文中明确地指定目标的IP地址和端口号
- 服务器必须从收到的分组中提取出发送端的IP地址和端口号
- 传送的数据可能乱序,也可能丢失
大体过程
1.服务器创建一个udp的socket,绑定端口8080用于监听数据包,通过调用receive方法阻塞的监听。
2.客户端创建一个自己的socket,该socket的端口假设操作系统分配的是4567
3.客户端发送数据包、目标ip和目标端口给下层的传输层,传输层就能够得到源ip、源端口、目的ip和目的端口,然后一步一步的打包交给下层,发送到服务器主机,服务器主机通过数据包的目的ip和目的端口,对比发现socket对应,然后把数据发送给对应的pid号为100的应用进程。
4.服务器解除阻塞,收取数据。
5.最后关闭连接,删除对应的socket
大体编程实现
参考
tcp套接字编程,大小写转换
https://www.bilibili.com/video/BV1JV411t7ow?p=20
https://blog.csdn.net/weixin_45902285/article/details/122814167