加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

TCP/IP与socket的关系

(2016-03-22 18:27:49)
分类: 网络

TCP通信过程:

应用层通过传输层进行数据通信时,TCPUDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供了称为套接字(Socket)的接口,区分不同应用程序进程间的网络通信和连接。两个不同主机上的进程要实现通信的话,要有ip地址(指明要传送的主机是哪一个),还要有套接字socket(绑定端口号)用来标识是主机的哪一个进程,如下图:

TCP/IP与socket的关系 

TCP/IP与socket的关系

socket是一个抽象层,它将复杂的TCPUDP操作简化成一下操作,

TCP/IP与socket的关系TCP/UDP是属于传输层的,传输层关心的是端到端之间的通信,也就是不同主机进程之间的通信,它不关心或者不用关心具体的点到点之间的通信是怎样实现的,这是由通信子网(网络层,数据链路层,物理层)完成的。IP是属于网络层的,

TCP/IP与socket的关系

 

详细分析:

一、端到端与点到点

点到点是物理拓扑,如光纤,就必须是点到点连接,点到点是网络层的,传输层只认为数据是从a直接到e的,但实际不是这样的,打个比方,传输层好象领导,他发布命令:要干什么事,但真正干的不是他,真正干的是员工,也许领导认为很简单一句话就可以干好的事,在员工眼里却是难于登天,手续极其烦琐,所以传输层是发布命令的领导,他说的是命令,也就是最终的目的,所以他只看到最初的地址和最终的地址,既一个任务的两个端点,网络层就相当于员工,领导的任务我要一步一步的作完,先从ab,在从b到 c...,所以他看到的只是整个任务的一个阶段,ab,bc...这就是点到点。也可以比喻成寄信,网络层给出的地址相当于地区地址(比如江苏徐州),但是传输层关注的最终的地址比如某某街道多少号,他俩相互配合共同完成将信息传递给正确的人。

端到端是网络连接。网络要通信,必须建立连接,不管有多远,中间有多少机器,都必须在两头(源和目的)间建立连接,一旦连接建立起来,就说已经是端到端连接了,即端到端是逻辑链路,这条路可能经过了很复杂的物理路线,但两端主机不管,只认为是有两端的连接,而且一旦通信完成,这个连接就释放了,物理线路可能又被别的应用用来建立连接了。TCP就是用来建立这种端到端连接的一个具体协议

端到端是传输层的,比如要将数据从A传送到E,中间可能经过A->B->C->D->E,对于传输层来说他并不知道b,c,d的存在,他只认为我的报文数据是从a直接到e的,这就叫做端到端。

总之,一句话概括就是端到端是由无数的点到点实现和组成的。

二、Socket

 

1.对于TCP

服务器端:

1)根据指定的地址族、数据类型和协议来分配一个socket的描述字及其所用的资源。

int socket(int domain, int type, int protocol);

domain:协议族,常用的有AF_INETAF_INET6AF_LOCALAF_ROUTE其中AF_INET代表使用ipv4地址

type:socket类型,常用的socket类型有,SOCK_STREAMSOCK_DGRAMSOCK_RAWSOCK_PACKETSOCK_SEQPACKET

protocol:协议。常用的协议有,IPPROTO_TCPIPPTOTO_UDPIPPROTO_SCTPIPPROTO_TIPC

2)绑定socket到一个IP地址和一个端口上

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:socket描述字,也就是socket引用

addr:要绑定给sockfd的协议地址

addrlen:地址的长度

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

3开启侦听,等待接授客户端的连接

int listen(int sockfd, int backlog);

sockfd:要监听的socket描述字

backlog:相应socket可以排队的最大连接个数 

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

连接某个socket

sockfd:客户端的socket描述字

addr:服务器的socket地址

addrlen:socket地址的长度

 

4TCP服务器监听到客户端请求之后,调用accept()函数取接收请求int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd:服务器的socket描述字

addr:客户端的socket地址

addrlen:socket地址的长度

ssize_t read(int fd, void *buf, size_t count);

读取socket内容

fd:socket描述字

buf:缓冲区

count:缓冲区长度

客户端:

1)申请一个套接字

2)连接服务器

 

 

2.对于UDP

服务器端:

1创建套接字

SOCKETsockSrv socket(AF_INET, SOCK_DGRAM, 0) ;

 

2将套接字绑定到本地地址和端口上

SOCKADDR_INaddrSrv ;

       addrSrv.sin_family AF_INET ;

       addrSrv.sin_port htons(6000) ;

       addrSrv.sin_addr.S_un.S_addr =htonl(INADDR_ANY) ;

 

       bind(sockSrv, (SOCKADDR *)&addrSrv,sizeof(SOCKADDR))      

 

3等待接收数据

SOCKADDR_INaddrClient ;

       int len sizeof(SOCKADDR) ;

       TCHAR szRecvBuf[100] ;

       recvfrom(sockSrv, szRecvBuf,lstrlen(szRecvBuf) 1, 0, (SOCKADDR       *)&addrClient,&len) ;

4关闭套接字

 

客户端:

1创建套接字

SOCKETsockClient socket(AF_INET, SOCK_DGRAM, 0) ;

2向服务器发送数据 

3关闭套接字

 

 

三、TCPUDP的区别

 1)基于连接与无连接 

  对系统资源的要求:TCP较多,UDP少 

  UDP程序结构较简单 

  流模式与数据报模式 

  TCP保证数据正确性,UDP可能丢包 

  TCP保证数据顺序,UDP不保证 

  部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息 

  拥有大量Client 

  对数据安全性无特殊要求 

  网络负担非常重,但对响应速度要求高 

  具体编程时的区别 socket()的参数不同 

  UDP Server不需要调用listenaccept 

  UDP收发数据用sendto/recvfrom函数 

  TCP:地址信息在connect/accept时确定 

  UDP:在sendto/recvfrom函数中每次均 需指定地址信息 

  UDPshutdown函数无效

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有