Saya pertama kali mempelajari jurusan komunikasi. Setelah lulus, teman sekelas saya berpisah untuk mengejar impian mereka dan melakukan perjalanan di antara lokasi konstruksi dari semua ukuran. Haha, hanya bercanda, ada juga beberapa orang luar biasa yang memasuki lembaga penelitian tertentu, ya? Ayahnya bukan sutradara, jadi dia seharusnya tidak terlalu gelap di dalam. Saya ingat ada kursus tingkat tinggi yang disebut Computer Network (mungkin nama ini). Ada konsep tentang jabat tangan, dan sekarang memeriksanya.
Mari kita lihat skema terlebih dahulu:
TCP berorientasi koneksi. Tidak peduli ke arah mana pihak lain mengirimkan data, koneksi harus dibuat antara kedua pihak. Dalam protokol TCP/IP, protokol TCP menyediakan layanan koneksi yang andal, dan koneksi diinisialisasi melalui tiga jabat tangan. Tujuan dari jabat tangan tiga arah adalah untuk menyinkronkan nomor seri dan nomor konfirmasi kedua belah pihak dan bertukar informasi ukuran jendela TCP.
1. Tangan Pertama: Buat koneksi. Klien mengirim segmen pesan permintaan koneksi, menetapkan posisi syn ke 1, dan nomor urutan adalah x; Kemudian, klien memasuki status syn_send dan menunggu server untuk mengonfirmasi;
2. Tangan kedua: Server menerima segmen pesan SYN. Ketika server menerima segmen pesan SYN dari klien, perlu mengkonfirmasi segmen pesan SYN dan mengatur nomor pengakuan ke x+1 (nomor urutan+1); Pada saat yang sama, ia juga perlu mengirim informasi permintaan syn, atur posisi syn ke 1 dan nomor urutan ke y; Server memasukkan semua informasi di atas ke dalam segmen paket (mis., Syn+ACK Message Segmen) dan mengirimkannya ke klien bersama -sama. Pada saat ini, server memasuki status syn_recv;
3. Jabat Tangan Ketiga: Klien menerima segmen paket SYN+ACK dari server. Kemudian atur nomor pengakuan ke Y+1 dan kirim segmen pesan ACK ke server. Setelah segmen pesan dikirim, baik klien dan server memasuki status yang ditetapkan dan menyelesaikan jabat tangan tiga kali TCP.
Setelah menyelesaikan tiga jabat tangan, klien dan server dapat mulai mengirimkan data. Di atas adalah pengantar keseluruhan untuk jabat tangan tiga kali TCP.
Bagaimana dengan keempat gelombang itu?
Setelah klien dan server membuat koneksi TCP melalui tiga jabat tangan, ketika transmisi data selesai, koneksi TCP harus terputus. Lalu ada "empat gelombang" misterius di sini untuk pemutusan TCP.
1. Gelombang pertama: Host 1 (dapat digunakan sebagai klien atau sebagai server), atur nomor urutan dan nomor pengakuan, dan kirim segmen pesan sirip ke host 2; Pada saat ini, tuan rumah 1 memasuki status fin_wait_1; Ini berarti bahwa host 1 tidak memiliki data untuk dikirim ke host 2;
2. Gelombang kedua: Host 2 menerima segmen pesan sirip yang dikirim oleh host 1, dan mengembalikan segmen pesan ACK ke host 1. Nomor pengakuan adalah nomor urutan ditambah 1; Host 1 memasuki status fin_wait_2; Host 2 memberi tahu host 1 bahwa saya tidak memiliki data untuk dikirim, jadi saya dapat menutup koneksi;
3. Gelombang Ketiga: Host 2 mengirim segmen pesan sirip ke host 1, meminta untuk menutup koneksi, dan pada saat yang sama, host 2 memasuki keadaan Close_wait;
4. Gelombang Keempat: Host 1 menerima segmen pesan sirip yang dikirim oleh Host 2, mengirim segmen pesan ACK ke host 2, dan kemudian host 1 memasuki status time_wait; Setelah host 2 menerima segmen pesan ACK dari host 1, itu menutup koneksi; Pada saat ini, Host 1 masih belum menerima balasan setelah menunggu 2msl, itu membuktikan bahwa sisi server telah ditutup secara normal, jadi tidak apa -apa, host 1 juga dapat menutup koneksi.
Pada titik ini, empat gelombang TCP selesai dengan bahagia. Ketika Anda melihat ini, Anda akan memiliki banyak pertanyaan dalam pikiran Anda, banyak yang tidak mengerti, dan rasanya berantakan; Tidak apa -apa, mari kita terus meringkas.
Mengapa Anda perlu berjabat tangan tiga kali?
Jabat tangan yang disebut tiga arah berarti membangun koneksi TCP, yang berarti bahwa ketika membuat koneksi TCP, klien dan server perlu mengirim total 3 paket untuk mengkonfirmasi pembentukan koneksi. Dalam pemrograman soket, proses ini dipicu oleh klien yang mengeksekusi Connect.
Karena kita telah merangkum tiga jabat tangan TCP, mengapa kita harus melakukan tiga kali? Mengapa kita pikir kita bisa menyelesaikannya dalam dua kali? Jadi mengapa TCP harus membuat tiga koneksi? Inilah yang dikatakan Xie Xiren di "Jaringan Komputer":
Untuk mencegah segmen permintaan koneksi yang gagal dari tiba -tiba ditransmisikan ke server, terjadi kesalahan.
Dalam buku ini, sebuah contoh diberikan sebagai berikut:
Generasi "segmen permintaan koneksi yang gagal" dalam kasus seperti itu: segmen permintaan koneksi pertama yang dikirim oleh klien tidak hilang.
Sebaliknya, ia tetap berada di simpul jaringan tertentu untuk waktu yang lama, mengakibatkan penundaan sampai waktu tertentu setelah koneksi dirilis sebelum mencapai server. Ini awalnya a
Segmen pesan yang gagal lama. Namun, setelah server menerima segmen pesan permintaan koneksi yang tidak valid ini, secara keliru berpikir bahwa itu adalah yang baru yang dikirim oleh klien lagi
permintaan koneksi. Jadi segmen pengakuan dikirim ke klien dan setuju untuk membangun koneksi. Dengan asumsi bahwa "jabat tangan tiga kali" tidak diadopsi, maka hanya server
Mengeluarkan konfirmasi dan koneksi baru dibuat. Karena klien belum mengeluarkan permintaan untuk membuat koneksi, konfirmasi server tidak akan diabaikan.
Tidak ada data yang akan dikirim ke server. Tetapi server berpikir bahwa koneksi transportasi baru telah dibuat dan sedang menunggu klien untuk mengirim data. Jadi,
Banyak sumber daya server terbuang sia -sia. Fenomena di atas dapat dicegah terjadi dengan menggunakan "jabat tangan tiga kali". Misalnya, situasinya sekarang,
Klien tidak akan mengeluarkan pengakuan atas pengakuan server. Karena server tidak dapat menerima konfirmasi, ia tahu bahwa klien tidak memerlukan koneksi untuk dibuat. "
Ini sangat jelas, yang mencegah server menunggu dan membuang -buang sumber daya.
Mengapa Anda harus melambai empat kali?
Mengapa Anda melambai empat kali?
Yang disebut gelombang empat arah adalah untuk menghentikan koneksi TCP, yang berarti bahwa ketika koneksi TCP terputus, klien dan server perlu mengirim total 4 paket untuk mengkonfirmasi pemutusan koneksi. Dalam pemrograman soket, proses ini dipicu oleh klien atau server yang dieksekusi dari dekat.
Protokol TCP adalah protokol komunikasi lapisan transportasi berbasis stream yang berorientasi koneksi, andal. TCP adalah mode dupleks penuh, yang berarti bahwa ketika host 1 mengirim segmen sirip, itu hanya berarti bahwa host 1 tidak memiliki data untuk dikirim. Host 1 memberi tahu Host 2 bahwa datanya telah dikirim; Namun, saat ini, host 1 masih dapat menerima data dari host 2; Ketika Host 2 mengembalikan segmen ACK, itu berarti bahwa ia sudah tahu bahwa host 1 tidak memiliki data untuk dikirim, tetapi host 2 masih dapat mengirim data ke host 1; Ketika Host 2 juga mengirim segmen sirip, itu berarti bahwa Host 2 tidak memiliki data untuk dikirim, dan itu akan memberi tahu Host 1 bahwa saya tidak memiliki data untuk dikirim, dan kemudian satu sama lain akan dengan senang hati mengganggu koneksi TCP ini. Jika Anda ingin memahami prinsip empat gelombang dengan benar, Anda perlu memahami perubahan di negara bagian selama empat gelombang.
Fin_wait_1: Keadaan ini perlu dijelaskan dengan cermat. Bahkan, arti sebenarnya dari status FIN_WAIT_1 dan FIN_WAIT_2 sama -sama menunggu pesan sirip pihak lain. Perbedaan antara kedua status ini adalah: status FIN_WAIT_1 sebenarnya ketika soket berada dalam keadaan mapan, ia ingin secara aktif menutup koneksi dan mengirim pesan sirip ke pihak lain. Pada saat ini, soket memasuki status fin_wait_1. Ketika pihak lain menanggapi pesan ACK, ia memasuki status FIN_WAIT_2. Tentu saja, dalam keadaan normal yang sebenarnya, tidak peduli apa pun pihak lain, pesan ACK harus segera menanggapi pesan ACK. Oleh karena itu, status fin_wait_1 umumnya sulit dilihat, dan status FIN_WAIT_2 sering dapat dilihat dengan NetStat. (Pihak Aktif)
Fin_wait_2: Keadaan ini telah dijelaskan secara rinci di atas. Faktanya, soket dalam status FIN_WAIT_2 berarti semi-koneksi, yaitu, satu pihak membutuhkan koneksi yang erat, tetapi juga memberi tahu pihak lain bahwa saya memiliki beberapa data untuk dikirimkan kepada Anda (informasi ACK) untuk saat ini, dan kemudian menutup koneksi nanti. (Pihak Aktif)
Close_wait: Arti dari keadaan ini sebenarnya adalah menunggu untuk ditutup. Bagaimana cara memahami? Ketika pihak lain menutup soket dan mengirimkan pesan sirip kepada diri sendiri, sistem Anda pasti akan menanggapi pesan ACK ke pihak lain, dan kemudian akan memasuki keadaan Close_Wait. Selanjutnya, yang benar -benar perlu Anda pertimbangkan adalah memeriksa apakah Anda masih memiliki data untuk dikirim ke pihak lain. Jika tidak, maka Anda dapat menutup soket dan mengirim pesan sirip ke pihak lain, yaitu tutup koneksi. Jadi, ketika Anda berada dalam keadaan Close_wait, yang perlu Anda lakukan adalah menunggu Anda untuk menutup koneksi. (Sisi pasif)
LAST_ACK: Keadaan ini relatif mudah dimengerti. Secara pasif menutup pesan ACK dari pihak lain setelah mengirim pesan sirip. Setelah menerima pesan ACK, Anda dapat memasukkan status tertutup yang tersedia. (Sisi pasif)
Time_wait: Ini berarti bahwa pesan sirip pihak lain telah diterima dan pesan ACK telah dikirim. Tunggu saja 2MSL untuk kembali ke keadaan tertutup yang tersedia. Jika dalam status Finwait1, saat menerima pesan dengan pihak lain dengan bendera sirip dan bendera ACK, Anda dapat langsung memasukkan status Time_wait tanpa melalui status FIN_WAIT_2. (Pihak Aktif)
Tertutup: Menunjukkan bahwa koneksi terganggu.
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang prinsip dan analisis proses tiga jabat tangan dan empat jabat tangan dalam protokol TCP/IP. Saya harap ini akan membantu semua orang. Jika ada kekurangan, silakan tinggalkan pesan dan nantikan pendapat Anda yang berharga.