가상회선을 수립하는 단계. 3 way handshake로 이뤄진다
SYN과 ACK 패킷을 주고 받으며, 데이터 전송 전 두 기기 간 연결을 수립한다
클라이언트에서 SYN 요청을 보낸다. SYN flag를 1로 하여 서버에 보낸다.
서버가 SYN 요청을 받고 SYN + ACK를 한 패킷에 보낸다. ACK flag를 1로하고 클라이언트에 보낸다. acknowledgement number는 seq(m) + 1이다. SYN flag도 1이다. 이때 seq은 클라이언트에서 보낸 요청 때 숫자와 다른 숫자이다. 이 단계에서 클라이언트에서 서버로 연결이 수립된다
클라이언트가 SYN 요청을 받고 ACK를 보낸다. ACK flag를 1로하고 서버에 보낸다. acknowledgement number는 seq(n)+1이다. SYN flag는 0이다. 이 단계에서 서버에서 클라이언트로 연결이 수립된다. 양쪽의 max segment size중 더 작은 값이 데이터 전송 시 사용된다.
seq에 랜덤 숫자를 사용하는 이유
다른 연결 간 seq 충돌을 피하기 위해 랜덤 숫자를 사용한다
seq이 예측 가능하면 보안 문제가 발생할 수 있다. ie) TCP seq prediction attack
https://en.wikipedia.org/wiki/TCP_sequence_prediction_attack
일반적으로 4 way handshake로 이뤄지지만 3 way도 가능하다
FIN과 ACK 패킷을 주고 받으며, 데이터 전송 전 두 기기 간 연결을 종료한다
각각 한쪽의 연결을 종료하는 FIN-ACK 쌍으로 이뤄져 있어. 한쪽만 연결을 종료한 상태인 Half-open 상태도 가능하다
TCP 연결은 생성 후 종료 시까지 여러 상태를 거친다.
상태 | 설명 |
---|---|
CLOSE | 커넥션 없음 |
LISTEN | Passive open, SYN을 기다리는 상태 |
SYN-SENT | SYN을 보내고 ACK를 기다리는 상태 |
SYN-RCVD | SYN+ACK을 보내고 ACK를 기다리는 상태 |
ESTABLISHED | 커넥션이 생성된 상태, 데이터를 전송할 수 있다. |
FIN-WAIT-1 | 첫 FIN이 보내진 상태, ACK를 기다리고 있다. |
FIN-WAIT-2 | 첫 FIN에 대한 ACK를 받은 상태, 2번째 FIN을 기다리고 있다. |
CLOSE-WAIT | 첫 FIN을 받고 ACK를 보낸 상태, 어플리케이션의 종료를 기다리고 있다. |
TIME-WAIT | 2번째 FIN을 받고 ACK를 보낸 상태, 동일 포트와 주소에 커넥션이 생성되지 않도록 하는 시간(2MSL time out)을 기다리는 상태 |
LAST-ACK | 2번째 FIN을 보내고 ACK를 기다리는 상태 |
CLOSING | 양쪽이 동시에 닫기로 한 상태 |
연결 수립은 통신을 하고자 할 때 발생한다. 종료는 조금 더 복잡하다.