【网络编程】TCPIP-小笔记集合
前言
主要记录TCPIP一些小笔记
说明:
- demo 基于 Linux。
TCP/IP 网络编程笔记散集
快速入门:

I/O 缓冲:
- I/O 缓冲在每个 TCP 套接字中单独存在。
- I/O 缓冲在创建套接字时自动生成。
- 即使关闭套接字也会继续传递输出缓冲中遗留的数据。
- 关闭套接字将丢失输入缓冲中的数据。
- 本端调用一次 write(),对端可能要分几次 read() 才能读完。
数据边界:
TCP 是流式的数据传输,消息没有边界,需要应用层自己去定义消息边界。
UDP 是数据报传输,所以协议保证了一次只能接收一个数据报。
个人表达:数据边界意思是,数据会不会自动分割,比如两个结构体连续存在一段内存中,那是有边界的,结构体把其分割了。若把其数据拷贝到数组里面,那是无边界的,因为分不清从哪里才是分割线。
UDP 网络编程:
- UDP 是可以使用 bind() 函数的,主要是配置本地IP和端口号。若不适用,则由系统随机分配。
- UDP 是可以使用 connect() 函数的,主要是配置远端IP和端口号。若不使用,则每次调用 sendto() 函数时都要设置、删除远端IP和端口号,耗时。
关闭I/O流:
- 调用
close()后:- 输入缓冲区的数据被丢弃。
- 输出缓冲区的数据依旧能发送到目的端。
- 调用
shutdown()后:- 关闭输入流后,输入缓冲区的数据被丢弃。后面新来的数据流,会对其进行 ACK,然后丢弃。
- 关闭输出流后,输出缓冲区的数据依旧能发送到目的端。
DNS:
- DNS主要基于UDP。
- 目前全球只有13台域名根服务器。
- 并不是每条DNS查询都要到达根服务器的,查询是逐级查询,各级都有缓存表,先查缓存表中的,没有再往上报。
- 8.8.8.8是Google公司提供的免费DNS服务器的IP地址。
- 也可以指定本地的DNS服务器,只要能解析域名与IP即可。
TCP:
- MSS,最大报文段长度。在连接建立的时候,即在发送SYN段的时候,同时会将MSS发送给对方(MSS选项只能出现在SYN段中!!!),告诉对端他期望接收的TCP报文段数据部分最大长度。
- https://blog.csdn.net/bobozai86/article/details/87372606
套接字选项:
- 套接字类型只能在创建时决定,以后不能再更改。
服务器快重启:
- 因为异常断开后原套接字进入 time-wait 状态(一般会维持几分钟),还没有进入 close 状态,所以其端口号等数据还是被占用的。服务器重启后不能正常使用该端口。
- 所以采用
SO_REUSEADDR设置。作用:- 当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
- SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。
- SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
- SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。
参考
- 《TCP/IP网络编程》
- 李柱明博客-TCP/IP TCP详细笔记
- github 阿婆主
【网络编程】TCPIP-小笔记集合的更多相关文章
- 《Python网络编程》学习笔记--UDP协议
第二章中主要介绍了UDP协议 UDP协议的定义(转自百度百科) UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务 ...
- 《Unix网络编程》读书笔记
UDP和TCP UDP(User Datagram Protocol,用户数据报协议)是一个无连接协议,不保证UDP数据报会到达其最终目的地,不保证各数据报的先后顺序跨网络后保持不变,也不保证每个数据 ...
- 《TCP/IP网络编程》学习笔记整理
简介 本笔记目前已包含 <TCP/IP网络编程>中的前 5 章,后续章节会在近期内补充完整. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔 ...
- 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档
Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...
- 《TCP/IP网络编程》读书笔记
1.Windows 下的 socket 程序和 Linux 思路相同,但细节有所差别(1) Windows 下的 socket 程序依赖 Winsock.dll 或 ws2_32.dll,必须提前加载 ...
- Linux网络编程1——小端模式与大端模式
数据存储优先顺序的转换 计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式).内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式.内存的高地址 ...
- 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识
从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...
- Python实战之网络编程socket学习笔记及简单练习
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 参数一:地址簇 socket.AF_INET IPv4(默认) socket.AF_IN ...
- Java网络编程(读书笔记)
部分片段: 早期web服务器由于Http链接短暂而有所掩盖,由于web页面和嵌入式的图片一般很小(至少与通常通过FTP获取软件包要小很多),由于web浏览器在获取各个文件后挂起连接,而不是一次保持数分 ...
随机推荐
- ESP32-http client笔记
基于ESP-IDF4.1 #include <string.h> #include <stdlib.h> #include "freertos/FreeRTOS.h& ...
- Java | 字符串的使用 & 分析
字符串 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,在程序中所有的双引号字符串,都是String类的对象. 字符串的特点 1.字符串的内容永不可变. 2.正在是因为字符串的不 ...
- 「Ynoi2015」我回来了
「Ynoi2015」我回来了 这东西已经不是 Ynoi 了,因为太水被嫌弃了. 如何提升自己的数据结构能力?从Ynoi做起 题目链接 其实这个题很小清新的辣,而且不卡常. 由于边权为 \(1\),所以 ...
- python使用笔记17--异常处理
什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Pyth ...
- docker容器技术基础之linux cgroup、namespace
一.开头 接触过docker的同学多多少少听过这样一句话"docker容器通过linux namespace.cgroup特性实现资源的隔离与限制".今天我们来尝试学习一下这两个东 ...
- CF1329F题解
能发现: 1.输出序列与掉落顺序没有任何关系(因为单调性不会被改变). 2.输出的序列 \(h_i\) 最多有一组 \(h_i=h_{i+1}\). 对 2 的证明: 当 \(h_{i+1}\) 与 ...
- File类与常用IO流第四章——IO字节流
一切文件在存储时,都是以二进制数字的形式保存的,都是一个一个字节.无论使用什么样的流对象,底层传输的始终是二进制数据. 字节输出流 OutputStream java.io.OutputStream ...
- 软件开发(js+java开发)的启发
发现了个很重要的意义 1,一个对象,既包含被监听的参数,也包括监听处理本身 2,基于1的开发模式 3,在函数中定义监听器 4,1)高内聚: 统一面向对象,一个功能一个对象 不同对象不互相调用,不互相引 ...
- Linux文件浏览(less、more、head、tail)以及vim编辑器命令总结
结合小编学习实践,整理了Linux下查看内容(less.more.head.tail)和编辑内容(vim)的部分基础命令解析: 1.less命令 分页浏览内容,如果在shell命令行下按回车键,则一点 ...
- LCT(Link-Cut-Tree)
LCT(Link-Cut-Tree) LCT维护一个森林,即把每个节点用splay维护,可以进行许多操作: 查询.修改链上的信息 随意指定原树的根(即换根) 动态连边.删边 合并两棵树.分离一棵树 动 ...