ISN + 1
로 설정하여 ACK 패킷을 클라이언트에게 전송ISN + 1
을 승인번호로 설정하여 ACK 패킷을 서버에 전송클라이언트 서버
| |
| ---------- SYN (ISN=c) --------> |
| |
| <----- SYN (ISN=s) + ACK ------- |
| (ACK=c+1) |
| |
| --------- ACK (ACK=s+1) -------> |
| |
3-WAY 핸드세이크 과정
1. 클라이언트 -> 서버: SYN (클라이언트 ISN 포함)
• 클라이언트 상태: CLOSED -> SYN-SENT
• 클라이언트가 서버에 연결을 요청하는 SYN 패킷을 보냅니다. 이 패킷에는 클라이언트의 초기 시퀀스 번호(ISN)가 포함되어 있습니다.
• 서버 상태: CLOSED -> LISTEN
• 서버는 클라이언트의 요청을 기다리는 상태입니다. 이는 서버가 클라이언트의 SYN 패킷을 수신할 준비가 되었다는 의미입니다.
2. 서버 -> 클라이언트: SYN + ACK (서버 ISN 포함, 클라이언트 ISN + 1 승인번호)
• 서버 상태: LISTEN -> SYN-RECEIVED
• 서버가 클라이언트의 SYN 패킷을 수신하고, 자신의 ISN을 포함한 SYN 패킷과 클라이언트의 ISN + 1을 승인번호로 설정한 ACK 패킷을 클라이언트에 보냅니다.
• 클라이언트 상태: SYN-SENT -> SYN-RECEIVED
• 클라이언트는 서버의 SYN + ACK 패킷을 수신하고, 다음 단계로 넘어갑니다.
3. 클라이언트 -> 서버: ACK (서버 ISN + 1 승인번호)
• 클라이언트 상태: SYN-RECEIVED -> ESTABLISHED
• 클라이언트가 서버의 ISN + 1을 승인번호로 설정한 ACK 패킷을 서버에 보냅니다. 이로써 클라이언트는 연결이 설정되었음을 확인합니다.
• 서버 상태: SYN-RECEIVED -> ESTABLISHED
• 서버는 클라이언트의 ACK 패킷을 수신하고, 최종적으로 연결이 설정되었음을 확인합니다.
예시 : 서버 설정(Node.js)
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});