linuxSocket - juedaiyuer/researchNote GitHub Wiki

#Linux Socket编程#

##本地进程间通信##

  1. 消息传递(管道、FIFO、消息队列)
  2. 同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)
  3. 共享内存(匿名的和具名的)
  4. 远程过程调用(Solaris门和Sun RPC)

##Socket##

###在网络中如何唯一标识一个进程

网络层ip-标识网络中的主机

传输层协议+端口-标识主机中的应用程序(进程)

三元组(ip,协议,端口)可以标识网络的进程

###socket###

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

domain 协议域 决定了socket的地址类型

当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()、listen()时系统会自动随机分配一个端口

#type:设定了socket的类型
#type与protocol不能随意组合
SOCK_STREAM  一般对应TCP、sctp
SOCK_DGRAM   一般对应UDP

###bind###

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

#sockfd socket()获得的file handle

#addr 指向要绑定给sockfd的协议地址,可能为本机IP地址或本地文件路径

###网络字节序与主机字节序###

主机字节序就是我们平常说的大端和小端模式

网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,一个字节的数据没有顺序的问题了。

在将一个地址绑定到socket的时候,请先将主机字节序转换成为网络字节序,而不要假定主机字节序跟网络字节序一样使用的是Big-Endian

###listen###

#backlog 相应socket可以排队的最大连接个数
int listen(int sockfd, int backlog);

###connect###

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

###accept###

###读写函数###

read()/write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg() 推荐使用
recvfrom()/sendto()

##三次握手##

ThreeWayHandshake

  1. 客户端向服务器发送一个SYN J,并进入SYN_SENT状态,等待服务器确认
  2. 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1,即发送了SYN+ACK包,此时服务器进入了SYN_RECV状态
  3. 客户端再想服务器发一个确认ACK K+1

SYN(synchronous)是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

ACK (Acknowledgement),即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误

##四次挥手##

FourWave

##source##

###个人库###

  • evernote:linux socket编程总结