精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux 內核網絡之 connect 的實現

系統 Linux
對于面向連接的協議,如 TCP, connect() 建立一條與指定的外部地址的連接。若在connect調用之前沒有綁定地址和端口,則會自動綁定一個地址和端口號套接口。

對于面向連接的協議,如 TCP, connect() 建立一條與指定的外部地址的連接。若在connect調用之前沒有綁定地址和端口,則會自動綁定一個地址和端口號套接口。

asmlinkage long sys_connect(int fd, struct sockaddr __user *uservaddr,
int addrlen)
{
struct socket *sock;
char address[MAX_SOCK_ADDR];
int err, fput_needed;
//根據文件描述符獲取套接口指針,并且返回是否需要減少對文件引用計數標志。
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (!sock)
goto out;
//將用戶空間的uservaddr數據復制到內核空間的address
err = move_addr_to_kernel(uservaddr, addrlen, address);
if (err < 0)
goto out_put;

err =
security_socket_connect(sock, (struct sockaddr *)address, addrlen);
if (err)
goto out_put;

//通過套接口系統調用的跳轉表proto_ops,調用connect操作。TCP 中為 inet_stream_connect(), UDP 為 inet_dgram_connect()
err = sock->ops->connect(sock, (struct sockaddr *)address, addrlen,
sock->file->f_flags);
out_put:
// 根據fput_needed標志,調用fput_light減少對文件引用計數操作
fput_light(sock->file, fput_needed);
out:
return err;
}

通過套接口系統調用的跳轉表 proto_ops ,調用 inet_stream_connect。

int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
int addr_len, int flags)
{
struct sock *sk = sock->sk;
int err;
long timeo;

lock_sock(sk);
/* socket的協議族錯誤 */
if (uaddr->sa_family == AF_UNSPEC) {
/* 如果使用的是TCP,則sk_prot為tcp_prot,disconnect為tcp_disconnect() */
err = sk->sk_prot->disconnect(sk, flags);
sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED;
goto out;
}

switch (sock->state) {
default:
err = -EINVAL;
goto out;
case SS_CONNECTED:
err = -EISCONN;
goto out;
case SS_CONNECTING:
err = -EALREADY;
/* Fall out of switch with err, set for this state */
break;
case SS_UNCONNECTED: /* 此套接口尚未連接對端的套接口,即連接尚未建立 */
err = -EISCONN;
if (sk->sk_state != TCP_CLOSE)
goto out;

/* 如果使用的是TCP,則sk_prot為tcp_prot,connect為tcp_v4_connect() */
err = sk->sk_prot->connect(sk, uaddr, addr_len); /* 發送SYN包 */
if (err < 0)
goto out;

/* 發出SYN包后socket狀態設為正在連接 */
sock->state = SS_CONNECTING;

/* Just entered SS_CONNECTING state; the only
* difference is that return value in non-blocking
* case is EINPROGRESS, rather than EALREADY.
*/
err = -EINPROGRESS;
break;
}

/* sock的發送超時時間,非阻塞則為0 */
timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);

/* 發出SYN包后,等待后續握手的完成 */
if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
/* Error code is set above */
/* 如果是非阻塞的,那么就直接返回錯誤碼-EINPROGRESS。
* socket為阻塞時,使用inet_wait_for_connect()來等待協議棧的處理:
* 1. 使用SO_SNDTIMEO,睡眠時間超過timeo就返回0,之后返回錯誤碼-EINPROGRESS。
* 2. 收到信號,就返回剩余的等待時間。之后會返回錯誤碼-ERESTARTSYS或-EINTR。
* 3. 三次握手成功,被sock I/O事件處理函數喚醒,之后會返回0。
*/
if (!timeo || !inet_wait_for_connect(sk, timeo))
goto out;

err = sock_intr_errno(timeo);
/* 進程收到信號,如果err為-ERESTARTSYS,接下來庫函數會重新調用connect() */
if (signal_pending(current))
goto out;
}

/* Connection was closed by RST, timeout, ICMP error
* or another process disconnected us.
*/
if (sk->sk_state == TCP_CLOSE)
goto sock_error;

/* sk->sk_err may be not zero now, if RECVERR was ordered by user
* and error was received after socket entered established state.
* Hence, it is handled normally after connect() return successfully.
*/
/* 更新socket狀態為連接已建立 */
sock->state = SS_CONNECTED;
/* 清除錯誤碼 */
err = 0;
out:
release_sock(sk);
return err;

sock_error:
err = sock_error(sk) ? : -ECONNABORTED;
sock->state = SS_UNCONNECTED;
/* 如果使用的是TCP,則sk_prot為tcp_prot,disconnect為tcp_disconnect() */
if (sk->sk_prot->disconnect(sk, flags))
sock->state = SS_DISCONNECTING;
goto out;
}

inet_stream_connect() 主要做了以下事情:

對協議族進行檢查。

此時套接口狀態為 SS_UNCONNECTED, 調用 tcp_v4_connect() 來發送SYN包。

等待后續握手的完成:

1、如果socket是非阻塞的,那么就直接返回錯誤碼 -EINPROGRESS。

2、如果socket為阻塞的,就調用 inet_wait_for_connect(),通過睡眠來等待。在以下三種情況下會被喚醒:

  • 使用 SO_SNDTIMEO 選項時,睡眠時間超過設定值,返回 0。connect()返回錯誤碼 -EINPROGRESS。
  • 收到信號,返回剩余的等待時間。connect()返回錯誤碼 -ERESTARTSYS 或 -EINTR。
  • 三次握手成功,sock的狀態從 TCP_SYN_SENT 或 TCP_SYN_RECV 變為TCP_ESTABLISHED,sock I/O事件的狀態變化處理函數sock_def_wakeup() 就會喚醒進程。connect() 返回0。

客戶端調用tcp_v4_connect 發送SYN包時,設置客戶端狀態為 TCP_SYN_SENT。

進程休眠

static long inet_wait_for_connect(struct sock *sk, long timeo)
{
/* 初始化等待任務 */
DEFINE_WAIT(wait);
/* 把等待任務加入到socket的等待隊列頭部,把進程的狀態設為TASK_INTERRUPTIBLE */
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);

/* Basic assumption: if someone sets sk->sk_err, he _must_
* change state of the socket from TCP_SYN_*.
* Connect() does not allow to get error notifications
* without closing the socket.
*/
/* 完成三次握手后,狀態就會變為TCP_ESTABLISHED,從而退出循環 */
while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
release_sock(sk);
/* 進入睡眠,直到超時或收到信號,或者被I/O事件處理函數喚醒。
* 1. 如果是收到信號退出的,timeo為剩余的jiffies。
* 2. 如果使用了SO_SNDTIMEO選項,超時退出后,timeo為0。
* 3. 如果沒有使用SO_SNDTIMEO選項,timeo為無窮大,即MAX_SCHEDULE_TIMEOUT,
* 那么返回值也是這個,而超時時間不定。為了無限阻塞,需要上面的while循環。
*/
timeo = schedule_timeout(timeo);
/* 被喚醒后重新上鎖 */
lock_sock(sk);
/* 如果進程有待處理的信號,或者睡眠超時了,退出循環,之后會返回錯誤碼 */
if (signal_pending(current) || !timeo)
break;
/* 繼續睡眠 */
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
}
/* 等待結束時,把等待進程從等待隊列中刪除,把當前進程的狀態設為TASK_RUNNING */
finish_wait(sk->sk_sleep, &wait);
return timeo;
}

當前進程加入到 socket 的等待隊列 sk_sleep 中,然后進入休眠,直到超時或接收到信號。

進程被喚醒

在三次握手中,當客戶端收到 SYN+ACK、發出ACK后,連接就成功建立了。此時連接的狀態從TCP_SYN_SENT或TCP_SYN_RECV變成了 TCP_ESTABLISHED,表示連接建立成功。最終會調用 sock_def_wakeup() 來處理連接狀態變化事件,喚醒進程,connect()成功返回。

調用過程如下

tcp_v4_rcv

-> tcp_v4_do_rcv

-> tcp_rcv_state_process

-> tcp_rcv_synsent_state_process

-> sk_wake_async(sk, 0, POLL_OUT);

static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
struct tcphdr *th, unsigned len)
{
...

if (!sock_flag(sk, SOCK_DEAD)) {
/* 指向sock_def_wakeup,會喚醒調用connect()的進程,完成連接的建立 */
sk->sk_state_change(sk);
/* 若采用異步通知,則發送SIGIO通知進程可寫 */
sk_wake_async(sk, 0, POLL_OUT);
}

...
}

當鏈路建立成功后異步發送SIGIO信號,喚醒阻塞的進程并通知 socket 可寫,這也就是為什么非阻塞調用 connect 時檢查 socket 是否可寫事件的原因。

static void sock_def_wakeup(struct sock *sk)
{
read_lock(&sk->sk_callback_lock);
/* 有進程阻塞在此socket上 */
if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
/* 喚醒此socket上的所有睡眠進程 */
wake_up_interruptible_all(sk->sk_sleep);
read_unlock(&sk->sk_callback_lock);
}

最終調用 __wake_up_common(),由于nr_exclusive 為 0,因此會把此socket 上所有的等待進程都喚醒。

責任編輯:華軒 來源: 今日頭條
相關推薦

2023-03-01 23:56:11

2023-03-01 23:53:30

Linuxshutdown進程

2023-03-28 15:51:20

2023-03-06 15:43:56

2021-09-17 11:59:21

tcpdump網絡包Linux

2021-09-08 10:21:33

內核網絡包Tcpdump

2024-08-22 14:47:50

開源Linux網絡抓包工具

2009-07-16 09:02:38

LINUX 2.4.x網絡安全LINUX開發

2025-03-07 08:30:00

pwruLinux網絡包追蹤

2025-10-13 02:11:00

2023-05-12 07:27:24

Linux內核網絡設備驅動

2010-07-19 10:05:52

ibmdwLinux

2021-11-15 04:00:07

Linux 內核動態

2021-11-14 07:29:55

Linux 內核靜態追蹤Linux 系統

2021-04-15 05:51:25

Linux

2013-12-18 14:44:10

2021-08-23 06:59:38

Linux內核代碼

2021-09-30 09:43:11

Linux內核Zstd補丁

2023-11-24 11:24:16

Linux系統

2021-05-31 07:30:47

Connectsocket函數
點贊
收藏

51CTO技術棧公眾號

丝袜美女在线观看| 国产精品www爽爽爽| 成人无遮挡免费网站视频在线观看| 麻豆成人久久精品二区三区红| 日韩在线观看成人| 一边摸一边做爽的视频17国产 | 久久国产精品色av免费看| 欧美视频第一页| 吴梦梦av在线| 日本高清中文字幕二区在线| 看片的网站亚洲| 国语自产精品视频在线看| 尤物视频最新网址| 日韩精品亚洲专区在线观看| 色综合欧美在线视频区| 一级黄色片播放| 欧美男男同志| 丁香亚洲综合激情啪啪综合| 国产精品一区二区三| 国产精久久久久久| 色婷婷综合网| 国产视频精品xxxx| 熟妇女人妻丰满少妇中文字幕| 亚洲综合电影| 亚洲国产视频直播| 曰韩不卡视频| yw视频在线观看| 成年人午夜久久久| 亚洲最大福利网| 国产无遮挡又黄又爽又色视频| 亚洲特级毛片| 久久香蕉国产线看观看av| 全黄一级裸体片| 国产成人av毛片| 欧美一级片免费看| 国产精品嫩草影院8vv8| 国产经典一区| 色婷婷av久久久久久久| 水蜜桃色314在线观看| 超碰caoporn久久| 欧美高清在线精品一区| 欧美福利一区二区三区| 免费的黄色av| 国产东北露脸精品视频| 成人黄色激情网| 亚洲无码久久久久| 青青草91视频| 国产精品美女在线| 日韩乱码一区二区| 亚洲日本欧美| 久久免费视频网| 国产一级av毛片| 亚洲天堂成人| 97色在线视频| 日韩特级黄色片| 午夜在线视频一区二区区别| 7m精品福利视频导航| 亚欧视频在线观看| 老鸭窝亚洲一区二区三区| 国产69久久精品成人| 亚洲欧美自拍视频| 久久午夜激情| 国产精品久久久久久久久借妻| 色老头一区二区| 免费在线观看成人| 成人激情视频在线| 国产黄色一级大片| 国产成人精品免费| 久久本道综合色狠狠五月| 日韩偷拍自拍| 亚洲国产精品成人久久综合一区| 一本一道久久a久久精品综合 | 欧美激情18p| 国产中文字字幕乱码无限| 亚洲三级国产| 日本亚洲欧美成人| 91在线观看喷潮| 国产成人免费在线| 久久久久欧美| yes4444视频在线观看| 亚洲国产精品ⅴa在线观看| 26uuu成人| 高清电影在线观看免费| 色综合一个色综合亚洲| 国产一级片自拍| 亚洲综合网狠久久| 亚洲欧洲在线视频| 开心激情五月网| 红桃视频国产一区| 国产成人精品av在线| 亚洲一区二区激情| 成人福利视频在线看| 日韩精品在在线一区二区中文| 男人天堂久久久| 亚洲一区二区三区影院| 国产性生交xxxxx免费| 日本一区二区三区播放| 亚洲精品视频网上网址在线观看| 久久精品在线观看视频| 亚洲激情成人| 国产啪精品视频网站| 丰满人妻av一区二区三区| 国产午夜精品在线观看| 国产女主播av| 深夜视频一区二区| 精品久久一二三区| 99久久99久久精品免费看小说.| 午夜精品电影| 国产精品久久久久999| 亚洲精品国产一区二| 国产三级欧美三级| 分分操这里只有精品| 国产一区精品福利| 日韩av在线一区二区| 日本aⅴ在线观看| 久久婷婷丁香| 国产视频99| 污污的视频在线观看| 欧美亚洲综合色| 亚洲成人av免费在线观看| 亚洲综合自拍| 国产精品久久久久久久久久尿| 国产免费叼嘿网站免费| 国产欧美一区二区三区鸳鸯浴 | 黄色成人在线网| 欧美美女bb生活片| mm131美女视频| 亚洲狼人精品一区二区三区| 91久久精品国产| 成年人视频在线观看免费| 欧美日韩国产区| 丰满熟女人妻一区二区三区| 国产精品成人a在线观看| 日韩美女视频中文字幕| 四虎影院在线域名免费观看| 亚洲一本大道在线| 亚洲成年人在线观看| 综合视频在线| 91久久国产精品| 黄a在线观看| 欧美日韩国产三级| 中国1级黄色片| 日韩一区欧美二区| 无遮挡亚洲一区| 欧美色999| 亚洲欧美一区二区精品久久久| 日韩女同强女同hd| av电影在线观看不卡| 日韩亚洲欧美一区二区| 99er精品视频| 久久韩国免费视频| 国产精品久久久久精| 18欧美亚洲精品| www.色欧美| 亚洲男女av一区二区| 91亚洲精品在线观看| 成人午夜在线影视| 精品国产乱码久久久久久老虎 | 日本黄色特级片| 久久精品成人| 亚洲第一综合| 亚洲成人高清| 欧美成人在线影院| 丰满少妇被猛烈进入| 亚洲444eee在线观看| av直播在线观看| 日本不卡视频在线观看| 综合网五月天| 澳门久久精品| 日本三级久久久| 日本精品在线| 欧美变态tickle挠乳网站| 日本一级淫片免费放| 久久久久久亚洲综合影院红桃| 网站一区二区三区| 91tv精品福利国产在线观看| 国产精品v欧美精品v日韩| 在线高清av| 日韩在线欧美在线| 欧美在线精品一区二区三区| 狠狠色香婷婷久久亚洲精品| 91导航在线观看| 国产黄人亚洲片| 国产裸体舞一区二区三区| 色999日韩| 国产精品对白刺激久久久| 中文字幕乱码在线播放| 色多多国产成人永久免费网站| www香蕉视频| 日本韩国欧美在线| 欧美一区二区三区爽爽爽| 99国产精品久久久久| 波多野结衣国产精品| 精品二区久久| 亚洲永久一区二区三区在线| 成人激情自拍| 国产精品一区电影| 成人ssswww在线播放| 色一区av在线| 性xxxx18| 欧美一级片在线观看| 国产在线一级片| 亚洲成人你懂的| 亚洲色图27p| 91免费国产视频网站| 日本黄色一级网站| 视频一区在线视频| 亚洲理论电影在线观看| 久久综合88| 欧美日本韩国国产| 成人三级毛片| 亚洲专区中文字幕| 91国拍精品国产粉嫩亚洲一区| 久久免费在线观看| 91在线中字| www.欧美精品| 国产精品一二三区视频| 亚洲国产欧美一区| 国产草草影院ccyycom| 欧美视频你懂的| 欧美一级淫片免费视频黄| 午夜激情久久久| 久久久久久久久久久97| 亚洲欧洲日产国产综合网| 国产精成人品免费观看| 91美女在线视频| 亚洲图片欧美另类| 国产精品18久久久久久久久| 精品综合久久久久| 热久久国产精品| 亚欧在线免费观看| 日韩有码一区二区三区| 精品久久久久久久免费人妻| 国产精品久久久久久模特| 日本a在线免费观看| 亚洲一级影院| 精品一区二区三区无码视频| 午夜久久一区| 黄色一级片国产| 欧美1区视频| 黄色特一级视频| 你懂的成人av| 久久香蕉视频网站| 欧美色综合网| 亚洲 自拍 另类小说综合图区| 黄色成人在线网址| 缅甸午夜性猛交xxxx| 国产精品美女久久久| 精品人妻一区二区三区四区在线| 亚洲人成毛片在线播放女女| 国产91在线免费| 久久久精品午夜少妇| 午夜免费高清视频| 麻豆免费精品视频| 中文字幕第一页在线视频| 国产在线一区二区| 国产日韩视频一区| 久久新电视剧免费观看| x88av在线| 亚洲欧洲日韩女同| 欧美黄色免费看| 午夜电影一区二区三区| 潘金莲一级淫片aaaaaa播放| 在线视频综合导航| 一区二区三区免费在线视频| 欧美一区二区三区在线观看| 亚洲av综合色区无码一二三区| 精品久久一区二区三区| 噜噜噜在线观看播放视频| 中国人与牲禽动交精品| 精品孕妇一区二区三区| 欧美交受高潮1| 免费亚洲电影| 成人网中文字幕| 国产精品调教视频| 日韩高清专区| 中文字幕一区二区三区久久网站| 久久久久久久久久伊人| 国产精品久久久亚洲一区| 成人性生交免费看| 成人免费va视频| 欧美丰满老妇熟乱xxxxyyy| 亚洲精品国久久99热| 国产尤物在线视频| 欧美日本在线视频| 粉嫩av一区二区夜夜嗨| 一区二区三区动漫| 婷婷在线播放| 日韩av电影院| 日本免费精品| 色就是色欧美| 亚洲小说欧美另类婷婷| www.欧美日本| 成人免费视频免费观看| x88av在线| 午夜不卡在线视频| 国产又大又黄又爽| 亚洲精品自拍第一页| 国产在线一区二区视频| 欧美在线观看网站| 亚洲视频国产| 色一情一乱一伦一区二区三欧美| 欧美日韩国产色综合一二三四| av五月天在线| 99久久精品一区二区| 一区视频免费观看| 欧美四级电影网| 欧美视频综合| 亚州成人av在线| 亚洲精品v亚洲精品v日韩精品| 台湾成人av| 亚洲一区自拍| 最新版天堂资源在线| 成人欧美一区二区三区视频网页| 国产一级片毛片| 欧美大片国产精品| 黄色在线免费看| 国产精品户外野外| 日韩有码一区| 真人抽搐一进一出视频| 国产一区二区久久| 久久久久麻豆v国产| 色偷偷成人一区二区三区91| 内射无码专区久久亚洲| 欧美精品在线网站| 欧美在线se| 日韩免费电影一区二区| 鲁大师成人一区二区三区| 欧美在线一级片| 亚洲国产一区二区视频| 精品国自产在线观看| 日韩亚洲欧美中文高清在线| 韩国三级一区| 欧美午夜精品久久久久久蜜| 一本色道久久综合亚洲精品高清| 精品国产免费久久久久久婷婷| 亚洲欧美一区二区三区国产精品| 亚洲天堂一二三| 日韩中文理论片| 四虎国产精品成人免费影视| 亚洲欧美一区二区原创| 日本vs亚洲vs韩国一区三区二区 | 国产精品扒开腿做爽爽爽的视频| 首页亚洲中字| 日日摸日日碰夜夜爽av | 久久成人小视频| 欧洲色大大久久| h视频在线观看免费| 国产精品女主播视频| 欧美成人自拍| 国产大片一区二区三区| 一区二区三区成人| 粉嫩小泬无遮挡久久久久久| 91高清在线免费观看| 久草在线成人| 狠狠热免费视频| 国产精品久久久久四虎| 国产精品亚洲欧美在线播放| 欧美超级乱淫片喷水| 粉嫩久久久久久久极品| 每日在线更新av| 中文子幕无线码一区tr| 国产孕妇孕交大片孕| 色综合久久久888| 狼人精品一区二区三区在线 | 中文字幕成人一区| 精品在线免费观看| 久久高清无码视频| 日韩精品一二三四区| 国产精品久久久久久吹潮| 99亚洲国产精品| av一区二区久久| 日本三级一区二区三区| 久久国产精品免费视频| www国产精品| 国产成人av影视| 亚洲免费电影在线| 天天干,夜夜爽| 国产精品美乳在线观看| 好看的日韩av电影| 亚洲国产av一区| 4438成人网| 麻豆网站免费在线观看| 在线视频一区观看| 成人高清视频在线| 亚洲一级特黄毛片| 91国产美女视频| 久久综合电影| 少妇一级淫片免费放播放| 欧美日韩亚洲综合在线 | 自拍偷拍中文字幕| 91精品国产综合久久精品图片| aa视频在线观看| 亚洲人一区二区| 菠萝蜜视频在线观看一区| 91精东传媒理伦片在线观看| 91av在线免费观看| 91精品啪在线观看国产18 | 日韩美女视频一区二区| 日本a一级在线免费播放|