网站的优化排名怎么做,创建网站需要注意什么,如何完整保存网站并做修改,共享ip做网站目录
UDP协议
1.1通信流程
1.2函数
socket
bind sendto
recvfrom
close
1.3实现udp通信
TCP协议
1.1TCP头部结构
1.2通信流程
三次握手
正式通信
四次挥手
1.3协议特性
面向字节流
可靠传输
序列号和确认号
重传机制
流量控制和拥塞控制
1.4常用函数
s…目录
UDP协议
1.1通信流程
1.2函数
socket
bind sendto
recvfrom
close
1.3实现udp通信
TCP协议
1.1TCP头部结构
1.2通信流程
三次握手
正式通信
四次挥手
1.3协议特性
面向字节流
可靠传输
序列号和确认号
重传机制
流量控制和拥塞控制
1.4常用函数
socket
bind
listen
accept
connect
send
recv
close
1.5实现tcp通信 socket又称套接字他的存在是为了解决 不同协议的识别TCP UDP不同主机的识别哪个IP发 哪个IP收不同进程的识别哪个端口发 哪个端口收 UDP协议 UDPuser datagram protocol的中文叫用户数据协议报属于传输层。UDP是面向非连接的协议它不与对方建立连接而是直接把我要发的数据报发给对方。所以UDP适用于一次传输数据量很少、对可靠性要求不高的或对实时性要求高的应用场景。
1.1通信流程
udp通信直接传输数据不关心数据是否丢包不会进行重传。 1.2函数
socket #include sys/socket.h int socket(int family,int type,int protocol); 功能创建一个用于网络通信的socket套接字family:协议族(AF_INETIPv4、AF_INET6(IPv6)、PF_PACKET(链路层编程))type:套接字类(SOCK_STREAM流式套接字、SOCK_DGRAM数据报式套接字SOCK_RAW原始套接字)protocol:协议类别(0、IPPROTO_TCP、IPPROTO_UDP一般置0返回值套接字
bind #include sys/types.h #include sys/socket.h int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen); 功能将socket与本机上的一个端口绑定随后就可以在该端口监听服务请求sockfd正在监听端口的套接口文件描述符通过socket获得addr需要绑定的IP和端口addrlenaddr的结构体的大小返回值失败返回一个小于0的值成功返回大于等于0的值
一般只有服务器端才需要“显示”绑定端口client的端口号一般由client的OS随机选择client不需要“显示”地绑定IP和端口号当client第一次给服务器发消息时OS会自动绑定IP和端口号。
struct sockaddr
{sa_family_t sa_family; // 2字节char sa_data[14] //14字节
};
struct sockaddr_inIPv4地址结构struct sockaddr通用地址结构
_sockfd ::socket(AF_INET, SOCK_DGRAM, 0);//填服务器端的信息
struct sockaddr_in local;
memset(local, 0, sizeof(local));
local.sin_family AF_INET;
local.sin_port htons(_localport);
local.sin_addr.s_addr INADDR_ANY;//将套接字与服务器端信息绑定
int n ::bind(_sockfd, (struct sockaddr *)local, sizeof(local)); sendto #include sys/types.h #include sys/socket.h ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); 功能发送数据、sockfd:正在监听端口的套接字文件描述符通过socket获得。buf发送缓冲区往往是使用者定义的数组该数组装有要发送的数据len:发送缓冲区的大小单位是字节flags:填0即可dest_addr:指向接收数据的主机地址信息的结构体也就是该参数指定数据要发送到哪个主机哪个进程addrlen:表示第五个参数所指向内容的长度返回值成功返回发送数据长度失败返回-1。
recvfrom #include sys/types.h #include sys/socket.h ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); sockfd正在监听端口的套接口文件描述符通过socket获得buf接收缓冲区往往是使用者定义的数组该数组装有接收到的数据len接收缓冲区的大小单位是字节flags一般置0src_addr指向发送数据的主机地址信息的结构体也就是我们可以从该参数获取到数据是谁发出的addrlen表示第五个参数所指向内容的长度返回值成功返回接收成功的数据长度失败返回-1
close #include unistd.h int close(int fd); 功能关闭某个文件描述符fdsocket产生的fd返回值
1.3实现udp通信
udp通信的简单实现Linux/udp_echo_server · swi/c - 码云 - 开源中国
TCP协议 TCP是面向连接的协议这是因为在一个应用进程可以开始向另一个应用进程发送数据之前这两个进程必须先相互“握手”即它们必须相互发送某些预备报文段以建立确保数据传输的参数。它有以下几个特点
面向连接TCP一定是“一对一”的无法像 UDP 协议那样在同一时刻像多个主机发送消息即无法做到一对多可靠的无论的网络链路中出现了怎样的链路变化TCP 都可以保证一个报文一定能够到达接收端当然不是说绝对可靠基于字节流消息是“没有边界”的所以无论我们消息有多大都可以进行传输。并且消息是“有序的”当前一个消息没有收到的时候即使它先收到了后面的字节已经收到那么也不能扔给应用层去处理同时对重复的报文会自动丢弃。
1.1TCP头部结构 序列号在连接建立时由计算机计算出的初始值通过 SYN 包传给对端主机每发送一次新的数据包就累加一次该序列号的大小。用来解决网络包乱序问题确认应答号指下次期望收到的数据的序列号发送端收到这个确认应答以后可以确认确认应答号减一的数据包已经被正常接收。主要用来解决不丢包的问ACK用以指示确认字段中的值是有效的即该报文段包括一个对已被成功接收的报文段的确认RST用以指示连接的强制拆除当接收到错误连接时会发送RST位置为1的报文SYN用以指示连接的建立该位为1的报文表示希望建立连接FIN用以指示连接的终止该位为1的报文表示希望断开连接 1.2通信流程
三次握手 正式通信 建立连接过程 服务端创建完监听套接字使用accept等待用户连接当用户连接时监听套接字会起到接客的作用此时再创建一个新的套接字来进行服务而监听套接字继续等待新的用户。用于服务的套接字由accept函数返回。
四次挥手 最开始的时候客户端和服务器都是处于ESTABLISHED状态然后客户端主动关闭服务器被动关闭。 第一次挥手 客户端发出连接释放报文并且停止发送数据。此时客户端进入FIN-WAIT-1终止等待1状态。第二次挥手 服务器端接收到连接释放报文后发出确认报文应答。此时服务端就进入了CLOSE-WAIT 关闭等待状态。第三次挥手 客户端接收到服务器端的确认请求后客户端就会进入FIN-WAIT-2终止等待2状态等待服务器发送连接释放报文服务器将数据发送完毕后就向客户端发送连接释放报文服务器就进入了LAST-ACK最后确认状态等待客户端的确认。第四次挥手 客户端收到服务器的连接释放报文后发出应答此时此时客户端就进入了TIME-WAIT时间等待状态但此时TCP连接还未终止必须要经过2MSL后等待最长报文寿命时间确保发送的应答被服务端收到当客户端撤销相应的TCB后客户端才会进入CLOSED关闭状态服务器端接收到确认报文后会立即进入CLOSED关闭状态到这里TCP连接就断开了四次挥手完成。 1.3协议特性
面向字节流
TCP以字节流的方式传输数据没有消息边界需要应用层进行数据的分包和组包12。这种方式使得TCP能够灵活地处理各种长度的数据但也可能导致黏包问题。黏包问题可以通过以下方法解决 数据定长规定数据的长度。 特殊字符进行间隔使用特殊字符分隔数据。 在不定长数据的应用层头部中添加数据长度字段接收方根据头部长度接收该长度的数据。
可靠传输
TCP提供可靠的数据传输服务能够在数据传输过程中检测和纠正错误确保数据的完整性、顺序性和可靠性。TCP通过以下机制确保数据的可靠传输 序列号和确认号每个数据包都有一个序列号接收方通过确认号告知发送方哪些数据已成功接收。 重传机制如果发送方未收到确认会重新发送数据包。 流量控制通过滑动窗口机制动态调整发送速率避免接收方缓冲区溢出。 拥塞控制通过慢启动、拥塞避免等算法动态调整发送速率避免网络拥塞。
序列号和确认号 序列号seq 序列号的主要作用是跟踪每个数据包中的数据在整个数据流中的位置。当TCP连接建立时每一端都会随机选择一个初始序列号ISN之后传输的数据包的序列号将基于这个初始值递增。例如如果一个数据包的序列号是100且包含100字节的数据那么下一个数据包的序列号将从200开始。这样即使数据包在传输过程中到达顺序被打乱接收端也能根据序列号重新组装数据确保数据的顺序性和完整性。 确认号ack 确认号则是接收端用来告诉发送端哪些数据已经被成功接收的。当接收端收到数据后它会发送一个确认包其中包含的确认号是接收到的数据的序列号加1。发送端通过检查这个确认号来确定数据是否需要重传。例如如果发送端收到的确认号是101那么它知道序列号为100的数据包已被接收端成功接收。 应答的情况有以下两种 重传机制 超时重传 当TCP发送一个数据包后它会启动一个定时器等待接收方的确认应答ACK。如果在定时器到期之前没有收到ACKTCP会认为数据包可能已丢失并重新发送该数据包。这个过程称为超时重传。超时重传时间RTO的设置非常重要它应该略大于数据包往返时间RTT。 快速重传 快速重传是另一种重传机制它不依赖于定时器而是基于接收到的重复ACK信号。如果发送方连续收到三个相同的ACK它会立即重传那些被认为丢失的数据包而不需要等待定时器超时。 超时重传
数据丢包
应答丢包 为什么要等待一个特定时间 如果该等待时间过长会导致网络空隙时间增大降低网络传输效率。如果等待时间过短可能会在应答未到来时进行重传导致网络负荷增大。 快速重传 流量控制和拥塞控制
流量控制
作用为了解决发送方和接收方发送和接收能力不匹配而导致的数据丢失问题,当发送方发送的太快,接收方来不及接受就会导致数据丢失
方式由接收端采用滑动窗口的形式告知发送方允许/停止发包解决TCP丢包问题。 拥塞控制
作用为了解决过多的数据注入到网络导致网络崩溃和超负荷问题
方式由发送方采用拥塞窗口的形式去判断网络状态从而采取不同算法执行TCP动态发包解决网络整体质量问题。
慢启动算法 发送方先探测网络拥塞程度并不是一开始就发送大量的数据发送方会根据拥塞程度增大拥塞窗口。例如发2个数据段得到应答再去尝试发4个数据段...直到找到合适数量的数据段 1.4常用函数
socket #include sys/socket.h int socket(int family,int type,int protocol); 功能创建一个用于网络通信的socket套接字family:协议族(AF_INETIPv4、AF_INET6(IPv6)、PF_PACKET(链路层编程))type:套接字类(SOCK_STREAM流式套接字、SOCK_DGRAM数据报式套接字SOCK_RAW原始套接字)protocol:协议类别(0、IPPROTO_TCP、IPPROTO_UDP一般置0返回值套接字
bind #include sys/types.h #include sys/socket.h int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen); 功能将socket与本机上的一个端口绑定随后就可以在该端口监听服务请求sockfd正在监听端口的套接口文件描述符通过socket获得addr需要绑定的IP和端口addrlenaddr的结构体的大小返回值失败返回一个小于0的值成功返回大于等于0的值
listen #include sys/types.h #include sys/socket.h int listen(int sockfd,int backlog) 功能listen函数使socket处于被动的监听模式并为该socket建立一个输入数据队列将到达的服务请求保存在此队列中直到程序处理它们。sockfd传入bind的sockfd。backlog请求连接队列的最大长度这个队列指的是多个客户端都请求建立连接时会把这些连接暂时存入队列中以便下一步调用accept接受连接。返回值成功则返回0否则-1。
accept #include sys/types.h #include sys/socket.h int accept(int sockfd, struct sockaddr* addr, socklen_t addrlen); 功能让服务器接受客户的连接请求。sockfd经过bind和listen的sockfd。addr此处addr参数是传出的函数成功执行后存的是客户端的IP和端口。addrlenaddr的结构体的大小返回值如果成功则会返回一个非负整数也就是accepted socket的文件描述符后续的通信则用这个文件描述符如果失败则返回-1。
connect #include sys/types.h #include sys/socket.h int connect(int sockfd, struct sockaddr* addr, socklen_t addrlen); 功能让服务器接受客户的连接请求。sockfd由socket函数创建的文件描述符。addr保存服务端的IP和端口addrlenaddr的结构体的大小返回值0表示成功-1表示错误失败。
send #include sys/types.h #include sys/socket.h int send( SOCKET s, const char FAR *buf, int len, int flags ); 功能数据发送函数。s指定发送端套接字描述符。buf指明一个存放应用程序要发送数据的缓冲区。len要发送的数据的字节数。flags一般置0。返回值n(n大于0意为成功发送 n 个字节n等于0意为对端关闭连接n小于0意为出错或者被信号中断或者对端 TCP 窗口太小数据发不出去send或者当前网卡缓冲区已无数据可收recv)
recv #include sys/types.h #include sys/socket.h int recv(int s, void *buf, int len, unsigned int flags); 功能数据接收函数。s指定接收端套接字描述符buf指向一个缓冲区用于存放接收到的数据。len缓冲区的长度。flags一般置0。返回值n(n大于0意为成功接收 n 个字节n等于0意为对端关闭连接n小于0意为出错)
close #include unistd.h int close(int fd); 功能关闭某个文件描述符fdsocket产生的fd返回值
1.5实现tcp通信
tcp通信的简单实现Linux/tcp_echo_server · swi/c - 码云 - 开源中国