应用实现:源端的应用进程交换报文实现应用协议,来实现各种各样的网络应用(dash,email, etc)
而应用层通信不可以直接通信,需要借助下层的服务才可以进行,通过层间接口交给下层,通过下层的服务传输
传输层在TCP/IP提供的就是socket API服务,传输报文之前建立socket,借助于socket收发,使用完成了以后关掉(socket就像一个门,接和收都一样)
两种socket类型:
- TCP:可靠的,字节流/管道(报文之间没有边界)服务
- UDP:不可靠(数据UDP数据包)服务
TCP套接字编程
- 服务器首先运行,等待连接建立
1. 创建欢迎socket:目的是返回一个整数(这个整数就是welcome soket,但没什么具体含义) 2. 将这个创建的整数和本地端口捆绑 3. 在欢迎socket上阻塞式等待接受用户的连接 (调用accept函数,如果没连接就阻塞,反之接受连接) 总的来说:创建——捆绑——等待 |
- 客户端主动和服务器建立连接
1. 创建客户端本地套接字(隐式捆绑到本地端口,就是默认与当前没用的端口捆绑)
2. 调用connect阻塞连接指定服务器进程的IP地址和端口号
- 当与客户端连接请求到来时
1. 服务器接受来自用户端的请求,解除阻塞式等待,返回一个新的sockket值(同时与服务端和客户端捆绑,这个是connection socket) - 连接API调用有效时,客户端与服务器建立了TCP链接
数据结构 sockaddr_in
- 作用:指定网络操作的目标地址(设置网络进程和端口号)
- 不仅仅可以用于IP通信,还可以用于IPX通信。所以要给一个常量说明使用在哪个通信的
- IP地址和port捆绑关系的数据结构(标示进程的端节点)
- 这个结构体用于存储 IP 地址。它包含了一个地址族(通常是 AF_INET,表示 IPv4),一个端口号和一个 IP 地址。当你创建一个套接字并想要连接到一个特定的 IP 地址和端口号时,你需要设置一个 struct sockaddr_in 结构体,并将它传递给 connect 或 bind 函数
//IP地址和port捆绑关系的数据结构(标示进程的端节点)
struct sockaddr_in{
short sin_family; //AF_INET
u_short sin_port; // port
struct in_addrsin_addr;
// IP address, unsigned long
char sin_zero[8]; // align
};