Linux网络编程学习心得.2

1.连接服务器

连接服务器

#include

 int connect(intsockfd , const struct sockaddr *addr,

                   socklen_t addrlen);

功能: 连接服务器

sockfd:  socket套接字

addr:  ipv4套接字结构体的地址

addrlen: ipv4套接字结构体的长度

 2.tcp服务器通信流程

Linux网络编程学习心得.2_第1张图片

 Linux网络编程学习心得.2_第2张图片

Linux网络编程学习心得.2_第3张图片

 监听套接字就是判断是否有新的套接字请求,监听套接字和已连接套接字不一样,

3.绑定ip和端口bind

给套接字绑定固定的端口和ip

#include

  int bind(int sockfd, const struct sockaddr *addr,

                socklen_t addrlen);

sockfd: 套接字

addr: ipv4套接字结构体地址

addrlen: ipv4套接字结构体的大小

返回值:

成功返回0 失败返回;-1

 4.listen监听

#include

int listen(int sockfd, int backlog);

参数:

    sockfd : 套接字

    backlog :  已完成连接队列和未完成连接队里数之和的最大值  128

5.accept接收 

#include

 int accept(int socket, struct sockaddr *restrict address,

           socklen_t *restrict address_len);

如果连接队列没有新的连接,accept会阻塞

功能: 从已完成连接队列提取新的连接

参数:

    socket : 套接字

    address : 获取的客户端的的ip和端口信息  iPv4套接字结构体地址

    address_len: iPv4套接字结构体的大小的地址

socklen_t len = sizeof(struct sockaddr );

返回值:  新的已连接套接字的文件描述符

6. tcp服务器通信步骤

1 创建套接字  socket

2 绑定  bind

3  监听 listen

4  提取  accept

5 读写

6 关闭

netstat查看端口占用

7.三次握手和四次握手

Linux网络编程学习心得.2_第4张图片

Linux网络编程学习心得.2_第5张图片

 三次握手和四次握手的报文有14个字节mac头20字节ip还有20字节tcp还有标志位,三次握手用到的标志位有SYN和ACK,四次握手用到的标志位是ACK和FIN,三次握手SYN信号是询问,之后服务端回复SYN+ACK,询问+应答,客户端ACK应答,四次握手,客户端FIN我要关闭了,服务端ACK应答,服务端过了一会再发送FIN我也关闭了,客户端应答ACK,等待2MSL时间,服务端没有数据发,就关闭。切记文件描述符创建了需要手动贯关闭

8.最大报文长度mss和滑动窗口

最大报文长度: 一般出现在三次握手的前两次,用来告知对方发送数据的最大长度

MTU: 最大传输单元  网卡

每一次读取数据之后,回ack报文,报文中会携带当前缓冲区大小,用来告知对方

Linux网络编程学习心得.2_第6张图片

9.多进程实现并发服务器

Linux网络编程学习心得.2_第7张图片

流程:

创建套接字

绑定

监听

while(1)

{

    提取连接(创建cfd)

    fork创建子进程

    子进程中,关闭lfd,服务客户端

      父进程关闭cfd,回收子进程的资源

}

关闭

10.tcp状态转换图

Linux网络编程学习心得.2_第8张图片

 总结:

connect函数了解需要传入的参数,套接字文件描述符,ipv4结构体(自定义),ipv4结构体长度

客户端需要创建套接字,连接套接字,写,读,关闭,服务端需要创建套接字,绑定,监听,接收,读,写,关闭,要注意监听套接字的文件描述符lfd和接收文件描述符cfd不一样, 监听套接字就是判断是否有新的套接字请求

绑定bind函数传入的参数套接字,ipv4结构体(自定义),ipv4结构体长度,绑定ip和端口

监听listen 函数传入参数,套接字和队列最大值128

accept函数传入的参数套接字,ipv4结构体(自定义),ipv4结构体长度,从已完成连接队列完成连接,返回新的文件描述符

tcp服务端步骤:创建,绑定,监听,提取,读,写,关闭

三次握手和四次握手的报文有14个字节mac头20字节ip还有20字节tcp还有标志位,三次握手用到的标志位有SYN和ACK,四次握手用到的标志位是ACK和FIN,三次握手SYN信号是询问,之后服务端回复SYN+ACK,询问+应答,客户端ACK应答,四次握手,客户端FIN我要关闭了,服务端ACK应答,服务端过了一会再发送FIN我也关闭了,客户端应答ACK,等待2MSL时间,服务端没有数据发,就关闭。

最大报文长度mss和最大传输单元mtu 一般1500

多进程实现高并发服务器,首先需要创建套接字,绑定,监听(创建lfd),循环   循环体里提取创建cfd,创建子进程fork(),文件描述符也创建,子进程需要关闭lfd,服务客户端,父进程需要关闭cfd,回收子进程的资源

tcp的三次握手和四次握手整体流程:客户端和服务端都处于关闭状态最开始,客户端发起连接请求,处于SYN_SENT状态,发送信号SYN给客户端,客户端接收信号变为SYN_RECV状态,再给客户端发送SYN+ACK信号,这时候客户端变为ESTABLISHED状态,再给服务端发送ACK信号,此时服务端也变成ESTABLISHED状态,下面说四次握手状态,客户端接收到一个信号close,此时客户端变为FIN_WAIT1状态,然后发送一个FIN信号给服务端,服务端变为CLOSE_WAIT状态,然后向客户端发送一个ACK信号,这时候客户端变为FIN_WAIT2状态,过了一会,服务端变为LAST_ACK状态,发送一个FIN信号给客户端,客户端变为TIME_WAIT状态,再向服务端发送ACK信号,这时候服务端变为CLOSE状态,过了2MSL时间,客户端自动变为CLOSE状态

你可能感兴趣的:(linux,网络,运维)