Java Serversocket.accept() tidak mengembalikan soket dalam urutan koneksi dari klien?

Kami membuat 2 koneksi antara server Java dan klien C++. Panggilan objek Java ServerSocket menerima() dua kali dan masing-masing mengembalikan 1 soket; klien C++ memanggil connect() dua kali. Kami berasumsi port Socket pertama yang dikembalikan oleh Accept() harus sama dengan port soket klien pertama yang memanggil connect(), dan sama untuk pasangan soket ke-2.

Tetapi dengan memeriksa nomor port pada setiap soket, saya kadang-kadang melihat kasus yang tidak normal, di mana Soket pertama dari terima() terhubung ke soket klien ke-2 yang memanggil connect(), dan soket ke-2 dari terima() terhubung ke soket klien pertama .

Baik server dan klien adalah single threaded di sini untuk membuat koneksi. Bagaimana urutannya bisa dibalik?


person Kevin    schedule 26.06.2014    source sumber


Jawaban (2)


Urutan paket sinkronisasi awal dari dua koneksi dapat dialihkan pada jaringan. Misalnya jika paket SYN awal koneksi "pertama" dihapus dan paket tersebut tidak dikirim ulang hingga paket SYN awal dari koneksi "kedua". Selain itu, meskipun server dan klien Anda memiliki thread tunggal, kode sistem yang menangani tumpukan TCP mungkin bersifat multithread.

person Warren Dew    schedule 26.06.2014
comment
Saya berasumsi jabat tangan selesai sebelum connect() kembali, jadi penanganan SYN yang dijatuhkan dan pengiriman ulang harus selesai sebelum connect() kembali. - person Kevin; 28.06.2014

Anda tidak tahu apa 'urutan koneksi dari klien' itu. Sambungannya adalah jabat tangan tiga arah dengan percobaan ulang paket. Urutan dalam antrian backlog akan menjadi urutan penerimaan ACK akhir, yang tidak Anda ketahui.

person user207421    schedule 27.06.2014
comment
Bisakah ACK terakhir setelah connect() kembali? Jika tidak, urutan ACK akhir harus sama dengan urutan connect(). - person Kevin; 28.06.2014
comment
ACK terakhir dikirim dari klien ke server; klien bahkan tidak tahu kapan itu diterima. - person Warren Dew; 28.06.2014