TCP是有链接的
不带数据的消息,只占一个序列号,只要个头
TCP的建立连接:
三次握手:必须由客户端发起,如果
SYN建立连接请求,客户端和服务端都有
(1)客户端->服务器
SYN(1bit)=1 seq(客户端序列号)=m
(2)客户端<-服务器
ACK=1 SYN=1 seq=n ack(服务器响应序列号)=m+1,希望你下次从m+1开始发
(3)客户端->服务器
ACK=1 SYN=0 seq=m+1 ack(服务器响应序列号)=n+1
TCP的释放连接:
四次挥手(可以交换申请释放要求):
FIN断开连接请求
(1)客户端->服务器
FIN=1 seq=a
(2)客户端<-服务器
ACK=1 seq=b ack=a+1
服务器要求的。。。。。。。。继续传输数据 一个字节一个seq编号
(3)客户端<-服务器
FIN=1 seq=c
(4)客户端->服务器
ACK=1 seq=a+1 ack=c+1
TCP的保证可靠性
UDP
系统调用
创建套接字
int socket(int domain, int type, int protocol);
domain 是地址族
名称(NAME)
socket - 创建套接字
概要(SYNOPSIS)
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>int socket(int domain, int type, int protocol);
参数
domain:是地址族,大堆网络协议选项
AF_INET //internet协议,通常选用这个
type:套接字类型
SOCK_STREAM //流式套接字,唯一对应TCP协议
SOCK_DGRAM //数据报套接字,唯一对应UDP协议
SOCK_RAW //原始套接字
protocol:通常设置为0
返回值(RETURN)
如果成功,则返回新套接字的文件描述符。发生错误时,返回-1,并适当地设置errno。
.
名称(NAME)
bind - 绑定IP地址和端口号 客户端可以不需要绑定,由操作系统进行分配,也可以自己固定IP
概要(SYNOPSIS)
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数
sockfd:创建套接字的时候返回的文件描述符
addr:给我申请的套接字,填充地址结构信息
通用地址结构:
addrlen:addr的长度
返回值(RETURN)
成功返回0,失败返回-1
名称(NAME)
socket - 设置监听套接字(把主动套接字:只能发送不能接收,变成被动套接字:只能接收不能发送)
可以同时进行三次握手的连接数量:2 * backlog + 1
概要(SYNOPSIS)
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>int listen(int sockfd, int backlog)
参数
sockfd:要监听的套接字的文件描述符
backlog:限制等待连接的的最大队列长度,设置太小容易被攻击,堵塞队列等于半连接队列+全连接队列 可以同时进行三次握手2*backlog+1,越大也不是最好
返回值(RETURN)
成功返回0,失败返回-1
名称(NAME)
accept - 接受客户端的连接
概要(SYNOPSIS)
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数
sockfd:监听套接字
addr:对方的地址
addrlen:对方的地址的长度
返回值(RETURN)
名称(NAME)
socket - 创建套接字
概要(SYNOPSIS)
参数
返回值(RETURN)
名称(NAME)
socket - 创建套接字
概要(SYNOPSIS)
参数
返回值(RETURN)
名称(NAME)
socket - 创建套接字
概要(SYNOPSIS)
参数
返回值(RETURN)
名称(NAME)
socket - 创建套接字
概要(SYNOPSIS)
参数
返回值(RETURN)
名称(NAME)
socket - 创建套接字
概要(SYNOPSIS)
参数
返回值(RETURN)
名称(NAME)
socket - 创建套接字
概要(SYNOPSIS)
参数
返回值(RETURN)