TCP/IP 网络编程
网络编程和套接字
TCP/IP协议族
- 应用层 HTTP FTP DNS NFS
- 传输层 TCP UDP
- 网络层 IP ARP RARP ICMP
- 数据链路层 Ethernet
UDP
格式:8B UDP报头,0~65527B 数据
头部格式:源端口,目标端口,长度,校验和(各2B)
- 面向无连接的不安全报式传输
- 不会握手,数据发出去就不管了
- 数据包丢失 就是全丢,不存在丢失一半
TCP
格式:头部(20~60B),数据(0-35535B)
头部格式:源端口,目标端口,序号,确认号,等等。。。。
- 面向连接的,流式传输协议,进行三次握手
- 数据发送 会数据确认,数据丢失会数据重传
TCPserver流程
- socket()
- bind()
- listen()
- accept()
hello_server.c
|
|
TCPserver流程
- socket()
- connect()
hello client.c
|
|
Windows实现
Windows下的项目配置
- 导入头文件 winsock2.h
- 链接ws2_32.lib库
属性-> 链接器 -> 输入 ->附加依赖项 -> ws2_32.lib
hello_server_win.c
|
|
hello_client_win.c
|
|
套接字类型和协议设置
协议族 Protocol Family
PF_INET IPV4互联网协议族
PF_INET6 IPV6互联网协议族
PF_LOCAL 本地通信UNIX协议族
|
|
地址族和数据序列
表示ipv4地址的结构体
|
|
网络字节序与地址变换
约定:统一大端序
- 大端(Big Endian) 高位字节存放到地位地址(像字符串)
- 小端(Little Endian) 高位字节存放到高位地址
0x12345678
大端:12 34 56 78
小端:78 56 34 12
字节序转换
|
|
h代表主机host n表示网络network s指short l指long
(Intel AMD常用小端序 ARM常用大端序)
ip地址的转换
|
|
网络地址的初始化
|
|
INADDR_ANY
|
|
服务器常用
TCP服务器与客户端
TCP服务端在accept后返回客户端的socket
客户端在connect后分配随机的端口
TODO echo的例子
UDP的服务端与客户端
UDP的客户端和服务器均只需要一个套接字
基于UDP的数据IO函数
|
|
UDP echo
server
|
|
client
|
|
UDP数据报存在边界
Python 取本机MAC地址
|
|
- 原文作者:xuehu
- 原文链接:https://www.xuehu96.com/post/tcpip/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。