TCP协议梳理
# server int sockfd = socket(AF_INET, SOCK_STREAM, 0); bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); # backlog参数指定了socket可以排队的最大连接数。具体来说,它定义了 # 在处理接受连接之前,等待队列中可以挂起的连接请求的最大数目。 # 这个数目包括了正在进行三次握手的半开连接,以及已经完成握手, # 等待程序通过accept()调用接受的完全建立的连接。 listen(sockfd, backlog); int client_sockfd = accept(sockfd, NULL, NULL); #client int sockfd = socket(AF_INET, SOCK_STREAM, 0); connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
close(conn); # 把引用计数减1,如果引用计数为0,则开始关闭流程,且会关闭读写两个方向 shutdown(conn,SHUT_WR|SHUT_RD|SHUT_RDWR); # 立即关闭连接,发送FIN包,关闭参数指定方向的连接,SHUT_WR只关闭写方向,SHUT_RD只关闭读方向,SHUT_RDWR关闭读写方向
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |C|E|U|A|P|R|S|F| | | Offset| Rsrvd |W|C|R|C|S|S|Y|I| Window | | | |R|E|G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | [Options] | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | : : Data : : | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+tcpStart := ipv4HeaderLength dataOffset := int(packet[tcpStart+12] >> 4) // First 4 bits tcpHeaderLength := dataOffset * 4
func CheckSum(data []byte) uint16 { var ( sum uint32 length int = len(data) index int ) for length > 1 { sum += uint32(data[index])<<8 + uint32(data[index+1]) index += 2 length -= 2 } if length > 0 { sum += uint32(data[index]) } sum += sum >> 16 return uint16(^sum) }
sysctl net.core.somaxconn net.core.somaxconn = 4096
sysctl net.ipv4.tcp_max_syn_backlog net.ipv4.tcp_max_syn_backlog = 512
sysctl net.ipv4.tcp_synack_retries net.ipv4.tcp_synack_retries = 2
sysctl net.ipv4.tcp_abort_on_overflow net.ipv4.tcp_abort_on_overflow = 0
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_rmem = 4096 87380 6291456
sysctl net.ipv4.tcp_wmem net.ipv4.tcp_wmem = 4096 16384 4194304
sysctl net.ipv4.tcp_sack net.ipv4.tcp_sack = 1
sysctl net.ipv4.tcp_dsack net.ipv4.tcp_dsack = 1
sysctl net.ipv4.tcp_available_congestion_control net.ipv4.tcp_available_congestion_control = cubic reno
sysctl net.ipv4.tcp_congestion_control net.ipv4.tcp_congestion_control = cubic
sysctl net.ipv4.tcp_fastopen net.ipv4.tcp_fastopen = 0
sysctl net.ipv4.tcp_max_tw_buckets net.ipv4.tcp_max_tw_buckets = 5000
最后更新于







