TCP/IP与socket的关系
| 分类: 网络 |
TCP通信过程:
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口,区分不同应用程序进程间的网络通信和连接。两个不同主机上的进程要实现通信的话,要有ip地址(指明要传送的主机是哪一个),还要有套接字socket(绑定端口号)用来标识是主机的哪一个进程,如下图:
socket是一个抽象层,它将复杂的TCP、UDP操作简化成一下操作,
TCP/UDP是属于传输层的,传输层关心的是端到端之间的通信,也就是不同主机进程之间的通信,它不关心或者不用关心具体的点到点之间的通信是怎样实现的,这是由通信子网(网络层,数据链路层,物理层)完成的。IP是属于网络层的,
详细分析:
一、端到端与点到点
点到点是物理拓扑,如光纤,就必须是点到点连接,点到点是网络层的,传输层只认为数据是从a直接到e的,但实际不是这样的,打个比方,传输层好象领导,他发布命令:要干什么事,但真正干的不是他,真正干的是员工,也许领导认为很简单一句话就可以干好的事,在员工眼里却是难于登天,手续极其烦琐,所以传输层是发布命令的领导,他说的是命令,也就是最终的目的,所以他只看到最初的地址和最终的地址,既一个任务的两个端点,网络层就相当于员工,领导的任务我要一步一步的作完,先从a到b,在从b到
端到端是网络连接。网络要通信,必须建立连接,不管有多远,中间有多少机器,都必须在两头(源和目的)间建立连接,一旦连接建立起来,就说已经是端到端连接了,即端到端是逻辑链路,这条路可能经过了很复杂的物理路线,但两端主机不管,只认为是有两端的连接,而且一旦通信完成,这个连接就释放了,物理线路可能又被别的应用用来建立连接了。TCP就是用来建立这种端到端连接的一个具体协议
端到端是传输层的,比如要将数据从A传送到E,中间可能经过A->B->C->D->E,对于传输层来说他并不知道b,c,d的存在,他只认为我的报文数据是从a直接到e的,这就叫做端到端。
总之,一句话概括就是端到端是由无数的点到点实现和组成的。
二、Socket
1.对于TCP:
服务器端:
1)根据指定的地址族、数据类型和协议来分配一个socket的描述字及其所用的资源。
int
domain:协议族,常用的有AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE其中AF_INET代表使用ipv4地址
type:socket类型,常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等
protocol:协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等
2)绑定socket到一个IP地址和一个端口上
int
sockfd:socket描述字,也就是socket引用
addr:要绑定给sockfd的协议地址
addrlen:地址的长度
通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。
3)开启侦听,等待接授客户端的连接
int
sockfd:要监听的socket描述字
backlog:相应socket可以排队的最大连接个数
int
连接某个socket
sockfd:客户端的socket描述字
addr:服务器的socket地址
addrlen:socket地址的长度
4)TCP服务器监听到客户端请求之后,调用accept()函数取接收请求int
sockfd:服务器的socket描述字
addr:客户端的socket地址
addrlen:socket地址的长度
ssize_t
读取socket内容
fd:socket描述字
buf:缓冲区
count:缓冲区长度
客户端:
1)申请一个套接字
2)连接服务器
2.对于UDP
服务器端:
1)创建套接字
SOCKETsockSrv
2)将套接字绑定到本地地址和端口上
SOCKADDR_INaddrSrv
3)等待接收数据
SOCKADDR_INaddrClient
4)关闭套接字
客户端:
1)创建套接字
SOCKETsockClient
2)向服务器发送数据
3)关闭套接字
三、TCP与UDP的区别
对系统资源的要求:TCP较多,UDP少
UDP程序结构较简单
流模式与数据报模式
TCP保证数据正确性,UDP可能丢包
TCP保证数据顺序,UDP不保证
部分满足以下几点要求时,应该采用UDP
拥有大量Client
对数据安全性无特殊要求
网络负担非常重,但对响应速度要求高
具体编程时的区别
UDP
UDP收发数据用sendto/recvfrom函数
TCP:地址信息在connect/accept时确定
UDP:在sendto/recvfrom函数中每次均
UDP:shutdown函数无效

加载中…