linux: TCP和UDP的不同

Linux网络编程4——个人总结

TCP与UDP通信流程

TCP通信的基本步骤如下:

服务端:socket---bind---listen---while(1){---accept---recv---send---close---}------close

客户端:socket------------------------------connect---send---recv-----------------close

UDP通信的基本步骤如下:

服务端:socket---bind---recvfrom---sendto----close

客户端:socket----------sendto----recvfrom---close

函数原型

TCP

TCP

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

server:

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

int bind(int fd_server, struct sockaddr *addr_server, int addrlen); /* 绑定服务器联系方式,让客户端有明确的联系方式可以连接 */

int listen(int fd_server, int backlog); /* 将fd_server转换为被动套接字,同时内核将listen到的请求的联系方式放入队列 */

int accept(int fd_server, struct sockaddr *addr_client, int *addrlen); /* 返回客户端socket的另一端,以此建立连线 *//* addr_client为传出参数,存放请求连接方的联系方式 ,如不需要刻意置为NULL */

client:

int connect (int fd_client,struct sockaddr *addr_server, int addrlen); /* 通过服务器的联系方式addr_server去连接服务器 */

/* 作为服务器,一定要绑定联系方式,不然请求方没有明确的联系方式可以连接 ,
   作为客户端,可以不用绑定联系方式,其端口号会由系统自动分配。
   建立连线的关键在于accept函数会返回客户端socket描述符所对应的另一端socket的描述符,
   并且客户端的联系方式也可以在accept中使用传出函数获取。                              */

after connect:

/* 建立连线后,就可以利用socket描述符发送接收信息了 */
int recv(int sockfd,void *buf,int len,unsigned int flags);
int send(int s,const void * msg,int len,unsigned int flags);
/* 会话结束,关闭 */
int close(int fd);

UDP

UDP

server:

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

/* 绑定服务器联系方式,让客户端有明确的联系方式可以连接 */
int bind(int fd_server, struct sockaddr *addr_server, int addrlen); 

/* 由于fd_server已经绑定联系方式(addr_server),请求方发送信息时,会通过addr_server发送消息至服务器fd_server,
   因此,服务器可以通过fd_server收到消息,并且请求方的联系方式可以通过传出参数addr_client获取                */
int recvfrom(int fd_server, void *buf, int len, unsigned int flags, struct sockaddr *addr_client, int *addrlen); 

/* 请求方的联系方式(addr_client)会由系统自己绑定,服务器是通过recvfrom的传出参数获取addr_client的。
   因此服务器发送消息时,可以通过客户端联系方式addr_client发送至客户端fd_client。                  */
int sendto(int fd_server, const void *msg, int len, unsigned int flags, const struct sockaddr *addr_client, int addrlen);

client:

/* 客户端的联系方式,服务器可以在recvfrom时获取,因此没有必要在一开始就绑定 */
int sendto(int fd_server, const void *msg, int len, unsigned int flags, const struct sockaddr *addr_client, int addrlen);

int recvfrom(int fd_server, void *buf, int len, unsigned int flags, struct sockaddr *addr_client, int *addrlen); 

/* 实际上,UTP通信方式并没有建立socket连线,双方均是通过联系方式(IP和端口号)进行通信的。
   服务器需要在一开始绑定联系方式,不然请求方没有明确的联系方式可以连接。
   当服务器recvfrom,不但可以收到客户端的消息,同时可以获取客户端的联系方式。            */

总结

1. TCP通信会建立连线。服务器的socket端口会bind联系方式,给客户端一个明确的联系方式去connect。服务器会listen到客户端的connect,并将其联系方式放入内核维护的任务请求队列中。之后服务器accept,获取与客户端通信的对应socket端口,从而建立连线!之后双方通过socket端口进行通信。

2. UDP通信不会建立连线。服务器的socket端口同样会bind联系方式。客户端通过此联系方式向服务器发送(sendto)消息,由于此联系方式已绑定到服务器的socket端口,因此服务器一定可以收到(recvfrom)消息,与此同时通过recvfrom的传出参数获取客户端的联系方式,从而可以通过客户端的联系方式向客户端发送消息。即,UTP的通信是基于联系方式(IP和端口号)的。是不可靠的通信方式。

3. 为什么TCP中的accept与UDP中的recvfrom都可以通过传出参数获取对方联系方式?不理解的话,可以类比寄信,别人给你寄一封信时,总会写上自己的联系方式吧。

时间: 2024-08-10 17:09:46

linux: TCP和UDP的不同的相关文章

Linux网络编程8&mdash;&mdash;对TCP与UDP的简易封装

引言 每次使用socket通信,都会有很对相似的操作.本文,会对TCP与UDP通信做一简单封装,并生成动态库. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #define __MY_SOCKET_H__ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #in

Linux 网络编程——TCP 和 UDP 数据报格式详解

TCP 报文格式 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP 报文段的报头有 10 个必需的字段和 1 个可选字段.报头至少为 20 字节.报头后面的数据是可选项. 1)源端口(16位) 标识发送报文的计算机端口或进程.一个 TCP 报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文. 2)目的端口(16位) 标识接收报文的目的主机的端口或进程. 3) 序号(也叫序列号)(32位) 用

TCP、UDP、IP 协议分析

本文转载自:http://blog.chinaunix.net/uid-26833883-id-3627644.html草根老师博客 互连网早期的时候,主机间的互连使用的是NCP协议.这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能.为了改善这种缺点,大牛弄出了TCP/IP协议.现在几乎所有的操作系统都实现了TCP/IP协议栈. TCP/IP协议栈主要分为四层:应用层.传输层.网络层.数据链路层,每层都有相应的协议,如下图 所谓的协议就是双方进行数据传输的一种

9 Differences between TCP and UDP Protocol-Java Network Interview Question-译文

原文:http://www.javacodegeeks.com/2014/07/9-differences-between-tcp-and-udp-protocol-java-network-interview-question.html?utm_source=tuicool TCP和UDP两种传输层的协议,它被广泛地用于在互联网发送一个主机之间的数据到另一个.很好的了解TCP和UDP的工作方式是任何程序员必不可少的.这就是为什么TCP和UDP之间的差异是一个流行的Java编程面试问题.我已经看

tcp和udp

多网卡 1 机器跨网段 2 网卡绑定 TCP和UDP tcp基于链接通信1 基于链接,则需要listen(backlog),指定连接池的大小2 基于链接,必须先运行服务端,然后客户端发起链接请求3 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if,空消息就break掉通信循环)4 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空,异常(解决方法是:服务

(转)TCP、UDP、IP协议

原文地址:http://blog.chinaunix.net/uid-26833883-id-3627644.html 互连网早期的时候,主机间的互连使用的是NCP协议.这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能.为了改善这种缺点,大牛弄出了TCP/IP协议.现在几乎所有的操作系统都实现了TCP/IP协议栈. TCP/IP协议栈主要分为四层:应用层.传输层.网络层.数据链路层,每层都有相应的协议,如下图 所谓的协议就是双方进行数据传输的一种格式.整个网络

再次对比TCP与UDP

免责声明:和往常一样,此文章的观点都属于'No Bugs'Hare(译注:一个网站) ,也许不一定和翻译者或者Overload编辑的意见一致.同时,翻译者从Lapine翻译到英语也具有一定的难度.除此之外,翻译者与Overload对于从阅读此文章所带来的后果或不作为明确不负任何责任. 原文地址:Once Again on TCP vs UDP 讨论TCP与UDP的好与坏几乎与Linux和windows的争辩有着一样长的历史.我一直支持一个观点,也就是:UDP与TCP都有各自的适用场景(比如:[N

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

TCP,UDP,IP总结

一.传输层的主要功能是什么? 分割并重新组装上层提供的数据流,为数据流提供端到端的传输服务. 二.传输层如何区分不同应用程序的数据流? 因为,对应传输层而言,它只需要知道目标主机上的哪个服务程序来响应这个程序,而不需要知道这个服务程序是干什么的.因此,我们只需要能够抽象的表示出来这些应用程序和服务程序即可.我们使用端口号来抽象标识每个网络程序. 传输层的TCP和UDP可以接收来自多个应用程序的数据流,用端口号标识他们,然后把他们送给Internet层处理: 同时TCP和UDP接收来自Intern