Here is a complete proof: as remarked in the answer by Norondion, we can reduce to
the case when C1rightarrowC2 is generically separable, i.e. k(C1) is separable
over k(C2). Let Asubsetk(C1) be a finite type k-algebra consisting of the regular
functions on some non-empty affine open subset U of C2 (it doesn't matter which one
you choose), so that k(C2) is the fraction field of A.
By the primitive element theorem, we may write k(C1)=k(C2)[alpha], where
alpha satisfies some polynomial f(alpha)=alphan+an−1alphan−1+cdots+a1alpha+a0=0, for some ai in K(C2).
Now the ai can be written as fractions involving elements of A, i.e. each
ai=bi/ci for some bi,ciinA (with ci non-zero). We may replace
A by A[c−10,ldots,c−1n−1] (this corresponds to puncturing U at
the zeroes of the ci), and thus assume that in fact the ai lie in A.
The ring A[alpha] is now integral over A, and of course has fraction field equal
to k(C2)[alpha]=k(C1). It need not be that A[alpha] is integrally closed,
though. We are going to shrink U further so we can be sure of this.
By separability of k(C1) over k(C2), we know that the discriminant Delta
of f is non-zero, and so replacing A by A[Delta−1] (i.e. shrinking U
some more) we may assume that Delta is invertible in A as well.
It's now not hard to prove that A[alpha] is integrally closed over A. Thus
textSpecA[alpha] is the preimage of U in C1 (in a map of smooth curves,
taking preimages of an affine open precisely corresponds to taking the integral closure
of the corresponding ring).
In other words, restricted to UsubsetC2, the map has the form
textSpecA[alpha]rightarrowtextSpecA, or, what is the same,
textSpecA[x]/(f(x))rightarrowtextSpecA.
Now if you fix a closed point mathfrakmintextSpecA, the fibre over this point
is equal to textSpec(A/mathfrakm)[x]/(overlinef(x))=k[x]/(overlinef(x)),
where here overlinef denotes the reduction of f mod mathfrakm.
(Here is where we use that k is algebraically closed, to deduce that A/mathfrakm=k,
and not some finite extension of k.)
Now we arranged for Delta to be in Atimes, and so barDelta (the reduction
of Delta mod mathfrakm, or equivalently, the discriminant of barf)
is non-zero, and so k[x]/(barf(x)) is just a product of copies of k,
as many as equal to the degree of f, which equals the degree of k(C1) over
k(C2). Thus textSpeck[x]/(barf(x)) is a union of that many points,
which is what we wanted to show.